gpt4 book ai didi

c# - 如何在 'CollectionEditor' 对话框中启用属性的默认值

转载 作者:行者123 更新时间:2023-11-30 23:29:20 26 4
gpt4 key购买 nike

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

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

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

编辑这个类的 Elements 属性现在将启动一个 CollectionEditor 对话框,左边是成员列表,右边是 PropertyGrid权利。

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

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

我想知道如何在 CollectionEditor 对话框的 PropertyGrid 上启用这个上下文菜单:

enter image description here

或者,可以实现任何方式(热键、)来重置这些收藏项属性。

最佳答案

您可以创建自己的收藏编辑器继承CollectionEditor类,然后覆盖 CreateCollectionForm方法,在集合编辑器表单中找到属性网格,然后为属性网格注册一个包含 Reset 菜单项的 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; }

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

关于c# - 如何在 'CollectionEditor' 对话框中启用属性的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com