gpt4 book ai didi

c# - 如何覆盖 PropertyGrid 中 DockStyle Editor 的行为

转载 作者:行者123 更新时间:2023-11-30 21:50:41 24 4
gpt4 key购买 nike

我们有一个自定义面板,它继承了 Panel 并具有类似于 SplitContainer Orientation 属性实现的 Orientation 属性。对于我们的自定义面板,DockStyle.Fill 永远无效,并且根据 Orientation 属性值,DockStyle 需要为垂直的左或右或水平的顶部或底部。

DockStyleEditor 类是密封的,因此我们不能将其子类化为我们自己的自定义 UITypeEditor。有没有办法使用 TypeDescriptor 或其他方式覆盖某些行为?

我们想为属性网格中的自定义面板 DockStyle 编辑器做的是:
1. 要么禁用中间的填充按钮,要么用红色斜杠圆圈显示它,以表明它作为一个选项不可用
2. 当 Orientation 属性为水平时禁用 Top 和 Bottom 按钮
3.当Orientation属性为垂直时禁用Left和Right按钮

最佳答案

DockEditor是密封的,但您可以基于 DockEditor 创建自定义停靠编辑器,而无需继承它。在您的定制UITypeEditor ,您可以创建一个 DockEditor 的实例,并使用反射操作其编辑器控件,然后使用它执行值编辑。

DockEditor 使用一个私有(private)类的 DockUI 控件。它有一个用于 None 按钮和容器控件的复选框,其中包含用于 FillTopLeft底部。然后,您可以根据您的逻辑简单地更改 EnabledBackColor 或其他属性。

在下面的代码中,我将找到那些复选框按钮,我将禁用 FillTopBottomNone 。用户可用的唯一选项将是 LeftRight:

public class MyDockEditor : UITypeEditor
{
DockEditor editor;
public MyDockEditor()
{
editor = new System.Windows.Forms.Design.DockEditor();
}
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
Type dockUiType = typeof(DockEditor)
.GetNestedType("DockUI", BindingFlags.NonPublic);
var dockUiConstructor = dockUiType.GetConstructors()[0];
var dockUiField = typeof(DockEditor)
.GetField("dockUI", BindingFlags.Instance | BindingFlags.NonPublic);
var dockUiObject = dockUiConstructor.Invoke(new[] { editor }) as Control;
dockUiField.SetValue(editor, dockUiObject);
var container = dockUiObject.Controls[0];
var none = dockUiObject.Controls[1];
var fill= container.Controls[0];
var left= container.Controls[1];
var right= container.Controls[2];
var top = container.Controls[3];
var bottom = container.Controls[4];
none.Enabled = false;
fill.Enabled = false;
top.Enabled = false;
bottom.Enabled = false;
return editor.EditValue(context, provider, value);
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return editor.GetEditStyle(context);
}
}

要使用它,只需使用 Editor 属性装饰控件的 Dock 属性即可:

[Editor(typeof(MyDockEditor), typeof(UITypeEditor))]
public override DockStyle Dock
{
get { return base.Dock; }
set { base.Dock = value; }
}

如下图所示,只启用了左右。

enter image description here

关于c# - 如何覆盖 PropertyGrid 中 DockStyle Editor 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192542/

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