拒绝在 PropertyGrid 控件中使用拆分器
Deny Use of Splitter in PropertyGrid Control
有什么方法可以拒绝用户在 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);
}
}
}
注意:不调用基本方法会产生副作用,即不会触发这些事件的任何侦听器。
说明:代码阻止了紫色拆分器。你的问题是指橙色还是紫色?
有什么方法可以拒绝用户在 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);
}
}
}
注意:不调用基本方法会产生副作用,即不会触发这些事件的任何侦听器。
说明:代码阻止了紫色拆分器。你的问题是指橙色还是紫色?