【问题标题】:How to enable Default Values for properties in a 'CollectionEditor' dialog如何在“CollectionEditor”对话框中启用属性的默认值
【发布时间】:2016-06-01 17:29:44
【问题描述】:

请先阅读整个问题以了解在哪里我可以重置属性的默认值。

当定义一个可以可视化设计的自定义类时,可以实现一个集合编辑器来修改列表、数组、集合等属性,使用以下模式:

[Editor(typeof(CollectionEditor), typeof(UITypeEditor)),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementCollection Elements
{
    get;
}

编辑此类的Elements 属性现在将启动一个CollectionEditor 对话框,左侧是成员列表,右侧是PropertyGrid

问题是,该属性网格的上下文菜单似乎已禁用。因此,我无法右键单击属性以将其值“重置”为默认值,尽管有 [DefaultValue]属性定义。

然而,DefaultValue 属性已被识别,因为该属性未序列化(并且在网格中以非粗体文本正确显示)。

我想知道如何通过CollectionEditor 对话框在PropertyGrid 上启用此上下文菜单

或者,任何可以实现重置这些集合项属性的方式(热键,)。

【问题讨论】:

    标签: c# .net winforms windows-forms-designer propertygrid


    【解决方案1】:

    您可以创建自己的集合编辑器继承CollectionEditor 类,然后重写CreateCollectionForm 方法,在集合编辑器表单中找到属性网格,然后注册一个包含重置菜单项的ContextMenuStrip对于属性网格,然后使用ResetSelectedProperty 重置属性:

    public class MyCollectionEditor : CollectionEditor
    {
        public MyCollectionEditor() : base(typeof(Collection<MyElement>)) { }
        protected override CollectionForm CreateCollectionForm()
        {
            var form = base.CreateCollectionForm();
            var grid = form.Controls.Find("propertyBrowser", true).First() as PropertyGrid;
            var menu = new ContextMenuStrip();
            menu.Items.Add("Reset", null, (s, e) => { grid.ResetSelectedProperty(); });
            //Enable or disable Reset menu based on selected property
            menu.Opening += (s, e) =>
            {
                if (grid.SelectedGridItem != null && grid.SelectedObject != null &&
                    grid.SelectedGridItem.PropertyDescriptor.CanResetValue(null))
                    menu.Items[0].Enabled = true;
                else
                    menu.Items[0].Enabled = false;
            };
            grid.ContextMenuStrip = menu;
            return form;
        }
    }
    

    并以这种方式装饰您的收藏品:

    [Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Collection<MyElement> MyElements { get; private set; }
    

    按照这种方法,您可以简单地添加分隔符、命令和描述菜单。

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 2011-07-21
      • 2016-08-15
      • 1970-01-01
      • 2016-02-11
      • 2010-10-16
      • 2016-05-11
      • 1970-01-01
      • 2012-07-11
      相关资源
      最近更新 更多