2013-10-01 71 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. 
         } 
        } 
    }