gpt4 book ai didi

c# - 拒绝在 PropertyGrid 控件中使用拆分器

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:43 27 4
gpt4 key购买 nike

有什么方法可以拒绝用户在 PropertyGrid 控件中使用 Splitter。我浏览了 PropertyGrid Control 的所有属性,但没有找到禁用它的方法。有什么我想念的吗?无论如何以编程方式进行。我正在使用 C# Winforms VS2010。

谢谢

最佳答案

查看 PropertyGrid 控件的源代码:MSDN PropertyGrid

要防止水平分隔线行为,请覆盖 OnMouseDown 和 OnMouseMove 方法。要防止垂直分隔线行为,一种方法是使用 IMessageFilter 并在鼠标位置靠近分隔线位置时消耗鼠标事件。

public class MyForm3 : Form, IMessageFilter {

PropertyGrid pg = new MyPropertyGrid { Dock = DockStyle.Fill };
Control gridView = null;
MethodInfo miSplittlerInside = null;

public MyForm3() {
Controls.Add(pg);
pg.SelectedObject = new Button { Text = "Bob" };

var f = typeof(PropertyGrid).GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
gridView = (Control) f.GetValue(pg);
miSplittlerInside = gridView.GetType().GetMethod("SplitterInside", BindingFlags.Instance | BindingFlags.NonPublic);

Application.AddMessageFilter(this);
}

private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_LBUTTONDBLCLK = 0x203;

public bool PreFilterMessage(ref Message m) {
if (m.HWnd == gridView.Handle) {
if (m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONDBLCLK) {
Point pt = new Point(m.LParam.ToInt32());
bool inside = (bool) miSplittlerInside.Invoke(gridView, new Object[] { pt.X, pt.Y });
if (inside) {
return true;
}
}
}
return false;
}

class MyPropertyGrid : PropertyGrid {
protected override void OnMouseMove(MouseEventArgs me) {
//base.OnMouseMove(me);
// do nothing, prevent user from moving the split bar
}

protected override void OnMouseDown(MouseEventArgs me) {
//base.OnMouseDown(me);
}
}
}

注意:不调用基本方法会产生副作用,即不会触发这些事件的任何监听器。

说明:代码阻止了紫色拆分器。您的问题是指橙色还是紫色?

enter image description here

关于c# - 拒绝在 PropertyGrid 控件中使用拆分器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32745445/

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