gpt4 book ai didi

c# - 动态选项对话框(使用反射)

转载 作者:行者123 更新时间:2023-11-30 21:23:47 26 4
gpt4 key购买 nike

有没有人知道一个好的组件(C# WinForms)允许创建一个选项(设置)表单,给定一个带有一堆属性的自定义类?我不是在寻找 Shiny 的东西,而是在寻找比属性网格更好的东西。我可以轻松处理视觉部分,但我只是不想浪费时间进行反射以添加和绑定(bind)控件(如果它已经存在)。

我很确定我以前在某个地方见过类似 Visual Studio 选项的表单,它是动态创建的(一些属性附加到类的属性,以允许分组和附加信息)。

[编辑] 例如,我可能有一个选项类:

public class Options : SerializableOptions<Options>
{
[Category("General")]
[Name("User name")]
[Description("Some text")]
public string Username { get; set; }

[Category("General")]
[Name("Log in automatically")]
public bool LogInAutomatically { get; set; }

[Category("Advanced")]
// ConnectionType is enum
public ConnectionType ConnectionType { get; set; }

// ...
}

将它传递给此表单后,它将创建两个面板(“常规”和“高级”),第一个面板上有一个 CheckBox 和一个 TextBox,第二个面板上有一个 ComboBox(具有所有可用的枚举)。

如果没有这样的控件,你们用什么?为每个选项手动添加、填充、格式化和绑定(bind)控件?

最佳答案

我不知道有任何控件可以让您执行此操作,但您自己操作并不难。 The easiest way is to create the dialog shell, a user control which acts as the base class for the options "panels", one (or more) attribute to control the name and grouping information, and an interface (which the user control implements) .

您的每个自定义选项面板都派生自用户控件并覆盖某种Initialize()Save() 方法(由用户控件提供)。它还提供确定名称/分组信息的属性(或多个属性)。

在对话框外壳中,反射性地检查程序集(或所有加载的程序集)中的所有公共(public)类型,以查找实现您的接口(interface)的类型。找到类型后,获取属性以确定将其放置在分组中的位置(此处最简单的方法是使用 TreeView ),调用 Activator.CreateInstance 创建用户控件的实例,然后将其存储在 Tag 属性中。当用户单击分组中的条目(树节点)时,获取 Tag 并将包含用户控件的面板设置为 Tag 属性中的对象。最后,当用户在对话框中单击“确定”时,遍历树节点,获取 Tag 属性并调用 Save 方法。

更新:另一种选择是使用属性网格控件。它没有“漂亮”的 UI 外观,但功能非常强大,已经支持按类别属性分组,并具有很大的灵 active 。您可以使用显示所有选项的单个属性网格,或者使用“混合”方法,使用 TreeView 按主要功能(插件、功能等)分组,可能基于类型。当用户单击该节点时,为属性网格提供对象实例。这种方法的唯一缺点是,当对属性网格值进行更改时,它们是“实时的”,因为基础属性会立即更改,这意味着除了保存每个值的副本外,没有“取消”的概念可以自己改变和执行某种类型的“重置”。

关于c# - 动态选项对话框(使用反射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1547867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com