C# 在winform中模拟visual studio的属性窗口
我想在我的winform应用程序中设计一个类似于visual studio面板的属性窗口。 事实上,我希望有一个网格,可以接受一个组合框作为它的一个单元格,这样用户就可以选择它的一个项目而不是键入 我知道这在wpf中是可能的,但我想知道在winform应用程序中是否有任何方法可以做到这一点 编辑: 我正在寻找一种在FooProperty前面显示FooForm结果的方法 注意:我不能将我真正应用程序的屏幕截图放在这里!但是我的属性网格中有类似下图的内容,我希望将所选背景图像的名称显示为BackgroundImage属性的值,该属性在红色矩形中指定,而不是(无)值C# 在winform中模拟visual studio的属性窗口,c#,winforms,C#,Winforms,我想在我的winform应用程序中设计一个类似于visual studio面板的属性窗口。 事实上,我希望有一个网格,可以接受一个组合框作为它的一个单元格,这样用户就可以选择它的一个项目而不是键入 我知道这在wpf中是可能的,但我想知道在winform应用程序中是否有任何方法可以做到这一点 编辑: 我正在寻找一种在FooProperty前面显示FooForm结果的方法 注意:我不能将我真正应用程序的屏幕截图放在这里!但是我的属性网格中有类似下图的内容,我希望将所选背景图像的名称显示为Backgr
请告诉我是否有办法做到这一点?您可以使用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()关联
returningUITypeEditorEditStyle.Modal
再次感谢,我在中尝试了您的解决方案,但问题是我不想使用可扩展对象。事实上,我想在FooProperty前面显示FooForm的结果,而不是作为Bar属性的值。@M\u Mogharabi您根本不需要使用可扩展对象转换器;类型编辑器是完全独立的,但我无法将FooForm的结果显示为FooProperty的值!我正在寻找一种方法来做到这一点!(注:我对打字机太新了)非常感谢,这很有效。但现在我有另一个问题;如何将ComboBox控件的“Items”属性添加到propertygrid中?我的意思是,我希望有一个文本框,旁边有一个浏览按钮,作为propertygrid的一个属性,当单击按钮时,表单会打开。@M_Mogharabi,它需要一个自定义的UITypeEditor
实现,通过[TypeEditor(…)]
,与GetEditStyle()关联
returningUITypeEditorEditStyle.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);
}
}
}
}