Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在winform中模拟visual studio的属性窗口_C#_Winforms - Fatal编程技术网

C# 在winform中模拟visual studio的属性窗口

C# 在winform中模拟visual studio的属性窗口,c#,winforms,C#,Winforms,我想在我的winform应用程序中设计一个类似于visual studio面板的属性窗口。 事实上,我希望有一个网格,可以接受一个组合框作为它的一个单元格,这样用户就可以选择它的一个项目而不是键入 我知道这在wpf中是可能的,但我想知道在winform应用程序中是否有任何方法可以做到这一点 编辑: 我正在寻找一种在FooProperty前面显示FooForm结果的方法 注意:我不能将我真正应用程序的屏幕截图放在这里!但是我的属性网格中有类似下图的内容,我希望将所选背景图像的名称显示为Backgr

我想在我的winform应用程序中设计一个类似于visual studio面板的属性窗口。 事实上,我希望有一个网格,可以接受一个组合框作为它的一个单元格,这样用户就可以选择它的一个项目而不是键入

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

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

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


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

您可以使用PropertyGrid和自定义类型编辑器来做到这一点

这里详细介绍了如何使用属性网格,以及如何使用自定义UI类型编辑器


您可以使用PropertyGrid和自定义类型编辑器来完成此操作

这里详细介绍了如何使用属性网格,以及如何使用自定义UI类型编辑器


您可以使用控件。你可以在网上找到很多例子。

你可以使用控件。您可以在internet上找到大量示例。

可以通过
属性网格提供网格;这使用了
System.ComponentModel
实现,它非常灵活,但相当复杂。但是,要提供建议值,请使用
TypeConverter
GetStandardValues
方法。完整示例:

edit:需要
CanConvertFrom
/
ConvertFrom
以组合方式工作)


可以通过
属性网格
提供网格;这使用了
System.ComponentModel
实现,它非常灵活,但相当复杂。但是,要提供建议值,请使用
TypeConverter
GetStandardValues
方法。完整示例:

edit:需要
CanConvertFrom
/
ConvertFrom
以组合方式工作)



你试过什么?你做过谷歌搜索吗?我想你想要的是
PropertyGrid
控件。它将读取一个对象的所有属性,显示并允许用户在运行时更改属性,就像您在设计时使用
属性窗口时所做的那样。我不知道为什么这个问题被“搁置”——我认为这个问题完全是自明的,并且完全包含在内。它肯定不是“离题的”,选择的原因是什么。您尝试了什么?你做过谷歌搜索吗?我想你想要的是
PropertyGrid
控件。它将读取一个对象的所有属性,显示并允许用户在运行时更改属性,就像您在设计时使用
属性窗口时所做的那样。我不知道为什么这个问题被“搁置”——我认为这个问题完全是自明的,并且完全包含在内。它肯定不是“离题的”,这是选择的原因。实际上,自定义类型编辑器(
UITypeEditor
etc)不会直接帮助您完成此操作。。。这是在
TypeConverter
中完成的。实际上,自定义类型编辑器(
UITypeEditor
等)不会直接帮助实现这一点。。。这是在
TypeConverter
中完成的,非常感谢,效果很好;如何将ComboBox控件的“Items”属性添加到propertygrid中?我的意思是,我希望有一个文本框,旁边有一个浏览按钮,作为propertygrid的一个属性,当单击按钮时,表单会打开。@M_Mogharabi,它需要一个自定义的
UITypeEditor
实现,通过
[TypeEditor(…)]
,与
GetEditStyle()关联
returning
UITypeEditorEditStyle.Modal
再次感谢,我在中尝试了您的解决方案,但问题是我不想使用可扩展对象。事实上,我想在FooProperty前面显示FooForm的结果,而不是作为Bar属性的值。@M\u Mogharabi您根本不需要使用可扩展对象转换器;类型编辑器是完全独立的,但我无法将FooForm的结果显示为FooProperty的值!我正在寻找一种方法来做到这一点!(注:我对打字机太新了)非常感谢,这很有效。但现在我有另一个问题;如何将ComboBox控件的“Items”属性添加到propertygrid中?我的意思是,我希望有一个文本框,旁边有一个浏览按钮,作为propertygrid的一个属性,当单击按钮时,表单会打开。@M_Mogharabi,它需要一个自定义的
UITypeEditor
实现,通过
[TypeEditor(…)]
,与
GetEditStyle()关联
returning
UITypeEditorEditStyle.Modal
再次感谢,我在中尝试了您的解决方案,但问题是我不想使用可扩展对象。事实上,我想在FooProperty前面显示FooForm的结果,而不是作为Bar属性的值。@M\u Mogharabi您根本不需要使用可扩展对象转换器;类型编辑器是完全独立的,但我无法将FooForm的结果显示为FooProperty的值!我正在寻找一种方法来做到这一点!(注意:我对TypeEditor太陌生了)
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);
            }

        }
    }
}