1

我想在我的 winform 应用程序中设计一个类似于 Visual Studio 属性窗口的面板。事实上,我希望有一个可以接受组合框作为其单元格之一的网格,因此用户可以选择其中一个项目而不是打字。

我知道在 wpf 中是可能的,但我想知道在 winform 应用程序中是否有任何方法可以做到这一点?

编辑: 我正在寻找一种在 FooProperty前面的示例中显示 FooForm 结果的方法。

注意:我不能在这里放置我的真实应用程序的屏幕截图!但我的属性网格中有类似下图的内容,我想将所选背景图像的名称显示为在红色矩形中指定的 BackgroudImage 属性的值,而不是(无)值。

在此处输入图像描述

请告诉我是否有办法做到这一点?

4

3 回答 3

3

可以通过提供网格PropertyGrid;这使用了System.ComponentModel非常灵活但非常复杂的实现。但是,要提供建议值 - 您GetStandardValues使用TypeConverter. 完整示例:

编辑:需要CanConvertFrom/ConvertFrom作为组合工作)

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{

    public class MyType
    {
        [TypeConverter(typeof(GiveMeOptionsConverter))]
        public string SomeProperty {get;set;}


        private class GiveMeOptionsConverter : TypeConverter
        {
            public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            {
                return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
            }
            public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
            {
                if (value is string) return value;
                return base.ConvertFrom(context, culture, value);
            }
            public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }
            public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
            {
                return false; // true is drop-down; false is combo
            }
            public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                // this gives you the `MyType` instance if you need it
                var obj = (MyType)context.Instance;

                return new StandardValuesCollection(
                    new[] { "abc", "def", "ghi" });
            }
        }
    }
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (var grid = new PropertyGrid {
                Dock = DockStyle.Fill,
                SelectedObject = new MyType()
            })
            using (var form = new Form { Controls = { grid } })
            {
                Application.Run(form);
            }

        }
    }
}
于 2013-09-23T08:03:39.127 回答
3

您可以使用System.Windows.Forms.PropertyGrid控件。你会在互联网上找到很多例子。

于 2013-09-23T07:59:32.373 回答
1

您可以使用 PropertyGrid 和自定义类型编辑器来执行此操作。

在这里,您可以详细了解如何使用属性网格,以及如何使用自定义 UI 类型编辑器。

http://msdn.microsoft.com/en-us/library/aa302326.aspx

于 2013-09-23T07:59:19.110 回答