繁体   English   中英

在Designer中进行C#交换

[英]C# swap in Designer

我有我的Control.When我改变控件的属性。 我明白了:

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

您可以查看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调用。

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

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

然后声明您的BorderShadow设置。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM