2013-10-01 95 views
1

我有我的Control.When我改變控件的屬性。我得到這個:設計師的C#交換

this.myLabel1.BorderShadow = true; 
this.myLabel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 

,我需要得到這個:

this.myLabel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
    this.myLabel1.BorderShadow = true; 

如何這樣做是Form.Desinger.cs自動完成? 如果你說爲什麼?

private bool BorderShadow_ = false; 
    public bool BorderShadow 
    { 
     get 
     { 
      return BorderShadow_; 
     } 
     set 
     { 
      if (Border_Style_ == BorderStyle.FixedSingle) 
      { 
       BorderShadow_ = value; 
      } 
      else 
      { 
       throw new ArgumentOutOfRangeException("BorderShadow", "BorderShadow can be true if BorderStyle=FixedSingle"); 
      } 
     } 
    } 
+4

什麼在'你want'什麼區別和'你得到什麼'? – Rohit

+1

交換Desinger屬性。 – Zuhan

+0

這樣做的意義何在?如果BorderStyle沒有設置爲BorderStyle.FixedSingle,爲什麼不忽略'BorderShadow'呢? –

回答

3

您可以查看ISupportInitialize接口。它允許您在初始化控件時跳過有效性檢查。例如(改編自我的項目之一):

public class MyControl : Control, ISupportInitialize 
{ 
    private bool _created = true; 

    public void BeginInit() 
    { 
     _created = false; 
    } 

    public void EndInit() 
    { 
     _created = true; 
     //check all your properties here too 
    } 

    private bool BorderShadow_ = false; 
    public bool BorderShadow 
    { 
     get 
     { 
      return BorderShadow_; 
     } 
     set 
     { 
      BorderShadow_ = value; 
      if (_created && Border_Style_ != BorderStyle.FixedSingle) 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 
} 

如果我沒有記錯,在VS設計師會自動調用添加到BeginInitEndInit爲你。

0

我認爲它們會按照它們定義的順序出現。所以,你可以用new舊的設置覆蓋:

public new BorderStyle BorderStyle 
{ 
    get {return base.BorderStyle;} 
    set {base.BorderStyle = value;} 
} 

,然後宣佈你BorderShadow設置。

0

設計師將始終按字母順序排列屬性,並且不能更改。

屬性的意義是,它是副作用免費,它可以在任何時間以任何順序進行更改。這意味着如果您有多個屬性代表某種複雜狀態,並且並非所有組合都有意義,則在切換屬性本身時不應報告此錯誤。

因此,要完成這些問題,你有兩種可能性:

  1. 像@Andrew已經提到的實施ISupportInitialize,如果你是這個國家內部照顧。
  2. 在屬性setter調用來檢查,如果目前進行的所有設置都是決策意識,只有在這種情況下執行所需的操作方法:

    public class MyControl : Control 
    { 
        private bool _BorderShadow; 
        private BorderStyle _BorderStyle; 
    
        public bool BorderShadow 
        { 
         get { return _BorderShadow; } 
         set 
         { 
          if(_BorderShadow != value) 
          { 
           _BordeShadow = value; 
           ApplyBorderShadowIfNeeded(); 
          } 
         } 
        } 
    
        public BorderStyle BorderStyle 
        { 
         get { return _BorderStyle; } 
         set 
         { 
          if(_BorderStyle != value) 
          { 
           _BorderStyle = value; 
           ApplyBorderShadowIfNeeded(); 
          } 
         } 
        } 
    
        private void ApplyBorderShadowIfNeeded() 
        { 
         if(_BorderStyle == BorderStyle.FixedSingle 
          && _BorderShadow) 
         { 
           // ToDo: Apply the shadow to the border. 
         } 
        } 
    }