【问题标题】:How can I force a property value on a derived object?如何强制派生对象上的属性值?
【发布时间】:2016-10-30 19:44:18
【问题描述】:

我想创建一个派生自 ListView 对象的类。

class MyListView : ListView
{
}

我尝试了一些方法来强制使用默认的 View 属性,但在设计时我似乎没有做任何事情对对象的属性产生任何影响。

我尝试过的一些事情是......

public MyListView():base()
{
    base.View = View.Tile;
}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[DefaultValue(View.Tile)]
new public View View
{
    get {
        return base.View;
    }
    set {
        base.View = value;
    }
}

protected override void InitLayout()
{
    base.InitLayout();
    base.View = View.Tile;
}

所以我的问题是如何强制一个值始终在 View 属性上保持不变,或者如何为其设置默认值并将该属性隐藏在我的新类中?

【问题讨论】:

    标签: c# winforms listview windows-forms-designer


    【解决方案1】:

    在正常情况下,重写该属性并将所需的值放入 getter 和 setter 就足够了。但是ListViewView 属性是一个特例。 ListViewDesigner 为设计器添加了一个带阴影的 View 属性。

    如果您查看ListViewDesigner 类,您将看到无论您的new 视图属性如何,设计器都使用基类的View 属性:((ListView) base.Component).View = value;

    我们可以做些什么来强制ListView 在设计时使用特定的视图?

    您可以使用Browsable(false) 装饰您的新View 属性。这样它就不会在属性网格中显示View 属性,但会在控件操作列表中显示该属性。

    要删除该操作列表,您可以为您的控件注册一个不同的Designer,例如ControlDesigner

    [Designer(typeof(ControlDesigner))]
    public class MyListView : ListView
    {
        public MyListView()
        {
            this.View = System.Windows.Forms.View.Tile;
        }
        [Browsable(false)]
        new public View View
        {
            get
            {
                return System.Windows.Forms.View.Tile;
            }
            set
            {
                base.View = System.Windows.Forms.View.Tile;
            }
        }
    }
    

    除了注册新的控件设计器之外,您还可以获取控件的设计器实例并清除其操作列表。

    不要忘记添加对System.Design.dll的引用并添加using System.Windows.Forms.Design;

    【讨论】:

    • 不错!谢谢你的例子。
    • 好的,那么ControlDesigner 来自哪里?
    • 添加对System.Design.dll的引用而不是添加using System.Windows.Forms.Design;
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2011-01-10
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    相关资源
    最近更新 更多