在Designer中进行C#交换

时间:2013-10-01 06:54:39

标签: c# .net winforms

我有我的控件。当我更改控件的属性时。我明白了:

 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");
            }
        }
    }

3 个答案:

答案 0 :(得分: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的来电。

答案 1 :(得分:0)

我认为它们将按照定义的顺序出现。因此,您可以使用new旧设置覆盖:

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

然后声明您的BorderShadow设置。

答案 2 :(得分:0)

设计师将始终按字母顺序排列属性,但无法更改。

属性的意义在于它无副作用并且可以随时以任何顺序进行更改。这意味着如果您有多个属性表示某种复杂状态并且并非所有组合都有意义,则在切换属性本身时不应报告此错误。

因此,要实现这些问题,您有两种可能性:

  1. 就像@Andrew已经提到过实施ISupportInitialize一样,如果你处于这种状态,请小心。
  2. 在属性设置器中调用一个方法,该方法检查当前所有设置是否有意义并仅在这种情况下执行所需的操作:

    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.
             }
        }
    }