1

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

 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

3 回答 3

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 设计器也会自动为你添加BeginInit调用EndInit

于 2013-10-01T07:08:17.363 回答
0

我认为它们将以与定义相同的顺序出现。new所以你可以用旧设置覆盖:

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

然后声明你的BorderShadow设置。

于 2013-10-01T07:11:11.373 回答
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.
             }
        }
    }
    
于 2013-10-02T06:45:18.840 回答