2010-04-25 70 views
3

我想創建一個自定義命令按鈕,默認寬度和高度爲特定設置。我有以下代碼:自定義控件覆蓋命令按鈕

public partial class myCommandButton : Button 
{ 
    public magCommandButton() 
    { 
     InitializeComponent(); 

    } 

    [DefaultValue(840)] 
    public override int Width 
    { 
     get 
     { 
      return base.Width; 
     } 
     set 
     { 
      base.Width = value; 
     } 
    } 

    [DefaultValue(340)] 
    public override int Height 
    { 
     get 
     { 
      return base.Height; 
     } 
     set 
     { 
      base.Height = value; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     base.OnPaint(pe); 
    } 
} 

但是,它不能編譯,因爲它告訴我,我不能覆蓋寬度或高度。任何人都可以告訴我,如果我錯誤地接近這個問題,或者有什麼解決辦法嗎?

回答

0

寬度和高度不是虛擬成員(檢查Reflector Control類),所以simpliest方法是重寫DefaultSize屬性:

 protected override Size DefaultSize 
     { 
      get 
      { 
       return new Size(840, 340); 
      } 
     } 

您還可以使用new modifier,但在這個例子中,我建議重寫DefaultSize。如果你在Reflector中檢查Control類,你會看到,Height和Width使用了很多內部/私人成員。所以我不認爲實現所有這些是一個好主意。 只需使用DefaultSize屬性。

+0

您不一定需要反射器來檢查類的方法/定義/修飾符/等。 您可以通過單擊上下文菜單中的「轉到定義」來查看Visual Studio中的類元數據,在單詞「Control」或需要檢查的任何類型上) – digEmAll 2010-04-25 13:25:34

+0

嗯......我不喜歡查看元數據只要。 我使用的是resharper + scout插件,它很棒。新的反射器有一些功能,你可以從代碼直接到這個工具並檢查實現,但我認爲偵察員更好。 但新的Resharper(v 5.0)是最好的 - 你可以直接從VS:D直接觀看編譯後的彙編源代碼 – Jarek 2010-04-25 13:52:39

1

首先,請注意,DefaultValueAttribute實際上沒有設置默認值!此屬性僅供Windows窗體設計器使用,以確定它是否應在屬性窗口中以常規或粗體字體顯示屬性;如果屬性與提供給DefaultValueAttribute的參數具有不同的值,則該屬性將以粗體顯示。

爲了設置一個默認大小,您可以:

  1. 覆蓋的DefaultSize屬性(如@亞雷克的答案所示),或

  2. 設置Size屬性的構造函數(儘管這個解決方案並不優雅)。