我在WinForms(http://msdn.microsoft.com/en-us/library/aa302326.aspx)中有一个PropertyGrid控件。现在,我想将中间的垂直线向左移动更多(它始终居中,但是我的键很短,而值是Paths,它们很长。即使用户,该控件也默认将线放置在中间可以移动它。关于用户友好性,我想以编程方式将这条线向左移更多。我现在已经多次搜索WinForms设计器属性以及PropertyGrid控件的成员,但没有找到该选项(或与此有关的任何事件)。
是否通过私有(private)隐藏在视觉/修改之外?我只是监督了吗? (在这种情况下,我非常抱歉),否则我该怎么办?
最佳答案
是的,不幸的是,这需要一些基于反射的技巧才能实现。
这是一个示例扩展类:
PropertyGridExtensionHacks.cs
using System.Reflection;
using System.Windows.Forms;
namespace PropertyGridExtensionHacks
{
public static class PropertyGridExtensions
{
/// <summary>
/// Gets the (private) PropertyGridView instance.
/// </summary>
/// <param name="propertyGrid">The property grid.</param>
/// <returns>The PropertyGridView instance.</returns>
private static object GetPropertyGridView(PropertyGrid propertyGrid)
{
//private PropertyGridView GetPropertyGridView();
//PropertyGridView is an internal class...
MethodInfo methodInfo = typeof(PropertyGrid).GetMethod("GetPropertyGridView", BindingFlags.NonPublic | BindingFlags.Instance);
return methodInfo.Invoke(propertyGrid, new object[] {});
}
/// <summary>
/// Gets the width of the left column.
/// </summary>
/// <param name="propertyGrid">The property grid.</param>
/// <returns>
/// The width of the left column.
/// </returns>
public static int GetInternalLabelWidth(this PropertyGrid propertyGrid)
{
//System.Windows.Forms.PropertyGridInternal.PropertyGridView
object gridView = GetPropertyGridView(propertyGrid);
//protected int InternalLabelWidth
PropertyInfo propInfo = gridView.GetType().GetProperty("InternalLabelWidth", BindingFlags.NonPublic | BindingFlags.Instance);
return (int)propInfo.GetValue(gridView);
}
/// <summary>
/// Moves the splitter to the supplied horizontal position.
/// </summary>
/// <param name="propertyGrid">The property grid.</param>
/// <param name="xpos">The horizontal position.</param>
public static void MoveSplitterTo(this PropertyGrid propertyGrid, int xpos)
{
//System.Windows.Forms.PropertyGridInternal.PropertyGridView
object gridView = GetPropertyGridView(propertyGrid);
//private void MoveSplitterTo(int xpos);
MethodInfo methodInfo = gridView.GetType().GetMethod("MoveSplitterTo", BindingFlags.NonPublic | BindingFlags.Instance);
methodInfo.Invoke(gridView, new object[] { xpos });
}
}
}
要移动拆分器的位置,请使用MoveSplitterTo扩展方法。
使用GetInternalLabelWidth扩展方法来获取拆分器的实际位置。请注意,我观察到在分配了SelectedObject且未显示PropertyGrid之前,GetInternalLabelWidth返回(-1)。
sample 使用:
using PropertyGridExtensionHacks;
//...
private void buttonMoveSplitter_Click(object sender, EventArgs e)
{
int splitterPosition = this.propertyGrid1.GetInternalLabelWidth();
this.propertyGrid1.MoveSplitterTo(splitterPosition + 10);
}
关于c# - PropertyGrid控件-修改中央分割垂直线的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14550468/