我在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/

10-10 13:45