- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个自定义面板,它继承了 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
按钮和容器控件的复选框,其中包含用于 Fill
、Top
、Left
、 右
和底部
。然后,您可以根据您的逻辑简单地更改 Enabled
、BackColor
或其他属性。
在下面的代码中,我将找到那些复选框按钮,我将禁用 Fill
、Top
、Bottom
和 None
。用户可用的唯一选项将是 Left
和 Right
:
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; }
}
如下图所示,只启用了左右。
关于c# - 如何覆盖 PropertyGrid 中 DockStyle Editor 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192542/
我有 3 个按钮停靠在左侧,但我想按特定顺序放置它们,例如按钮 1、按钮 3、按钮 2 但是当我开始按上述顺序停靠它们时,button3 在 button1 之前出现!!!?? 我怎样才能维护自己的订
我正在尝试以我以编程方式创建的新形式插入几个对象;基本上我想要一个 Button 在底部和一个 RichTextBox 填充所有剩余空间。我将第一个设置为 Dock = DockStyle.Botto
我正在尝试做一些非常简单的事情,但在 C# Winforms 中给我带来了巨大的问题。我在 TabPage 上有两个组框。一个停靠在右边,一个停靠在底部。我在页面上也有一个图表 (System.Win
我有一个表格。它有一个停靠在顶部的面板和一个停靠在底部的面板。表单的其余部分是中间的面板。我希望它扩展以填充表单的其余部分,因此我将这个中心面板的停靠样式设置为填充。当我在视觉上这样做时,没有任何跳跃
我们有一个自定义面板,它继承了 Panel 并具有类似于 SplitContainer Orientation 属性实现的 Orientation 属性。对于我们的自定义面板,DockStyle.Fi
我在 Windows 窗体中使用过,我创建了一个面板,在其中放置控件并为它们提供 DockStyle.Fill 以将它们的大小最大化到周围的面板。 在 WPF 中我想要相同的。我有一个 TabCont
public partial class TBForm : Form { private readonly ChromiumWebBrowser browser; public TBF
我是一名优秀的程序员,十分优秀!