问题标签 [uitypeeditor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1694 浏览

.net - UITypeEditor 和 IExtenderProvider

我有一个扩展器 (IExtenderProvider),它使用附加属性扩展了某些类型的控件。对于这些属性之一,我编写了一个 UITypeEditor。到目前为止,一切正常。

扩展器本身也有几个属性,我试图将它们用作 UITypeEditor 的一种默认值。我想要做的是能够在扩展器本身(而不是扩展控件)上设置一个属性,并且当我为扩展控件上的一个附加属性打开 UITypeEditor 时,我想在UITypeEditor 为扩展器上的属性值。

一个简单的例子:ExtenderProvider 有一个属性 DefaultExtendedValue。在表单上,​​我将此属性的值设置为“我的值”。扩展控件通过提供程序具有带有 UITypeEditor 的属性 ExtendedValue。当我打开属性 ExtendedValue 的编辑器时,默认(初始)值应设置为“我的值”。

在我看来,执行此操作的最佳位置是 UITypeEditor.EditValue,就在调用 IWindowsFormsEditorService.DropDownControl 或 .ShowDialog 之前。

唯一的问题是我不能(或者我还没有发现如何)在 EditValue 中获取扩展器提供程序本身,以读取相关属性的值并将其设置在 UITypeEditor 中。上下文为我提供了扩展控制,但在这种情况下,这对我没有用。

有什么办法可以实现我正在尝试的吗?任何帮助表示赞赏!

谢谢汤姆


@samjudson:这不是一个坏主意,但不幸的是它并没有完全让我到达那里。我真的希望能够为扩展器提供程序的每个实例单独设置此默认值。(对于不同的扩展控件组,我可能在一个表单上有多个不同的值。)

0 投票
1 回答
9866 浏览

c# - ICustomTypeDescriptor、TypeDescriptionProvider、TypeConverter 和 UITypeEditor

我试图全面了解您如何使用 ICustomTypeDescriptor、TypeDescriptionProvider、TypeConverter 和 UITypeEditor 来更改 PropertyGrid 显示和与对象交互的方式。

有人可以告诉我这是否正确,或者我是否遗漏了任何主要概念或要点?我真的只是想了解您为什么以及何时使用每个课程。

ICustomTypeDescriptor

  • 在类中实现此接口完全覆盖类的本机属性,并用 ICustomTypeDescriptor.GetProperties() 返回的 PropertyDescriptors 替换它们

类型描述提供者

  • 用于扩展类的现有属性
  • TypeDescriptionProvider 通过 TypeDescriptionProvider 属性附加到类
  • TypeDescriptionProvider 的 GetTypeDescriptor() 方法返回要附加到该类型的现有属性的 ICustomTypeDescriptor。
  • PropertyGrid 将显示通过反射找到的类的属性,以及通过 TypeDescriptionProvider 添加到类的属性

类型转换器

  • 在类型之间转换
  • 就使用用于在属性网格中显示/编辑的复杂类型和原始类型之间转换的 PropetyGrid 而言。
  • TypeConverter 的 GetStandard values 方法也可用于在 propertygrid 中显示可能值的列表

UITypeEditor

  • 定义用于操作复杂类型属性的自定义编辑器。
  • 通过属性与属性相关联。

因此 ICustomTypeDescriptor 一个 TypeDescription 提供程序用于添加/更改/替换对象的整个属性。TypeConverter 和 UITypeEditor 应用于单个属性并控制这些特定属性的交互方式。

0 投票
3 回答
9438 浏览

c# - 如何为闭源类型的所有属性注入自定义 UITypeEditor?

我想避免在我为其编写自定义 UITypeEditor 的特定类型的每个实例上放置 EditorAttribute。

我无法在类型上放置 EditorAttribute,因为我无法修改源。

我引用了将要使用的唯一 PropertyGrid 实例。

我可以告诉 PropertyGrid 实例(或所有实例)在遇到特定类型时使用自定义 UITypeEditor 吗?

是一篇 MSDN 文章,提供了如何在 .NET 2.0 或更高版本中执行此操作的起点。

0 投票
2 回答
4001 浏览

c# - 将对象传递给 UITypeEditor

我目前希望使用 PropertyGrid 来允许用户编辑我的一些类,但是我在将对象传递给他们使用的 UITypeEditor 时遇到了困难。当用户按下下拉菜单时,我想显示一个已加载纹理的列表框以供选择,如果他们想使用应用程序尚未加载的纹理,他们可以单击一个按钮从文件对话框中选择一个。如果我在这里没有意义,请模拟以下形式:

下拉图片.

我的问题:要填充列表框,我需要访问管理 UITypeEditor 中资源列表的类。

现在我已经为我自己的类解决了这个问题,方法是在创建它们的管理对象时给它们一个参考。然后,在 UITypeEditor 中,我使用该引用来访问我需要的内容。但是我不能为我没有写过的类做这个,比如 XNA Texture2D 类。

以下是我使用的类的样子:

我一直在研究我的选择,它们似乎是:

  1. 使管理类静态。

我真的不想这样做。由于每种资源的加载方式不同,因此有几个管理类。还有一些类需要在这些之前创建并传入。

  1. 将管理类设为单例。

我也不想这样做。这似乎是一种“隐藏”问题而不是“解决”问题的快速而肮脏的方式。我也可能希望将来有几个管理类,单例会消除这些类。

  1. 创建一个包含对管理类及其目标(例如 XNA Texture2D)的引用的包装类。

这就是我目前正在考虑做的事情。它会非常简单快捷地完成,但它的一些事情让我烦恼,但我不知道是什么。

关于将我需要的内容传递给 UITypeEditor 的上述方法或其他方法有什么想法吗?

感谢您的阅读。

0 投票
1 回答
898 浏览

c# - 我可以让默认集合编辑器和/或自定义 UIEditor 调用属性的 set 访问器吗?

我正在为一个应用程序编写一个插件,其中我有一个自定义类,该类赋予程序的本机对象。API 允许我直接从本机文件中的对象读取和写入键控字符串。因此,我不是在每个属性的 Get 和 Set 访问器中读取和写入私有字段,而是在程序中的本机对象中读取和写入这些用户字符串。

用户通过 PropertyGrid 控件访问这些属性。到目前为止,除了现在我需要存储自定义对象类型(Floor )的自定义集合( FloorCollection )之外,这一切都可以使用简单的属性正常工作。

所以我使用XmlSerializer设置了一个属性。GET 访问器从本机对象中读取用户字符串,然后将该字符串反序列化为 FloorCollection 的实例。SET 访问器通过读取FloorCollection的实例并将其序列化为用户字符串来执行相反的操作。

这是我的财产的样子:

我可以在默认集合编辑器中通过我的PropertGrid打开这个集合属性。但是,默认集合编辑器仅在 GET 访问器提供的引用处编辑集合,而不是调用 SET 访问器将其保存回对象。所以我可以在默认编辑器中编辑集合,但是当我关闭并重新打开编辑器时,集合不会改变,因为永远不会调用 SET 访问器来将集合序列化回本机对象中的用户字符串。

我可以修改默认集合编辑器以调用属性的 set 访问器吗?如果我为该属性设置了一个自定义UITypeEditor,是否可以使用属性集访问器将其保存回该属性?或者是否有其他方法可以强制访问集合属性的代码通过值而不是引用来获取和设置属性?

0 投票
1 回答
814 浏览

codesmith - 任何人都有一个选择 System.Type 实例的 UITypeEditor 吗?

我正忙着编写一个 CodeSmith 模板,它的属性之一是 type System.Type。我希望能够使用选择程序集的 UI 选择类型,加载程序集,然后显示该程序集中可用的类型。然后我可以去选择一种类型。

有没有人遇到或编写过执行此操作或类似操作的代码?

0 投票
1 回答
1724 浏览

.net - 控件集合的设计时编辑器支持

我想向组件添加一个表示控件集合的属性,并有一个集合编辑器,我可以使用它轻松选择属于该集合的控件。VS使用以下代码自动完成了我想要的几乎所有操作:

我得到了默认的CollectionEditor,可以添加和删除控件,并且集合是序列化的。

问题是我不想添加控件,我想从表单上的其他可用控件中选择多个控件。有什么简单/标准的方法可以做到这一点,还是我必须编写自己的集合编辑器并运行控件集合?

尽管有很多关于集合编辑器 (UITypeEditors) 和其他设计时主题的材料,但我无法找到任何链接来演示这种确切的行为,因此感谢您提供任何帮助。

0 投票
2 回答
655 浏览

c# - 从 UITypeEditor 检索应用于 .net 中属性的父级的属性

它并不像标题所说的那么简单,但我希望你能理解。

考虑这种情况:

接下来,我将 MyButton 的实例放入属性网格中,展开属性 MC 并编辑 SubProp2。

从 SubProp2 的类型编辑器中,我想获取应用于属性 MC 的属性。

查看上下文,PropertyDescriptor.ComponentType,我们到达类型:MyClass。但是,如果我查看应用于 MyClass 的属性,它只会返回直接应用于 MyClass 的属性,而不是应用于属性 MC 的额外属性。

我正在努力回到 MC,以便我可以读取那里应用的属性。有人有什么想法吗?

预计到达时间:

我已经在下面回答了:

0 投票
2 回答
1279 浏览

c# - 在属性网格中禁用复制粘贴

我在属性网格中有一个 FileNameEditor,它有一些条目,如

主文件:“C:\blah1”

Sec 文件:“C:\blah2”

等等。

我的问题是我不能从一个属性条目复制和粘贴到另一个,我也不能手动输入字段。是否有特定的属性可以在 FileNameEditor 中进行编辑。例子

谢谢

0 投票
0 回答
797 浏览

c# - .Net、WinForms 中的 UITypeEditor 和只读引用类型属性

我以为我已经确定了类型编辑器和转换器,直到我在 UITypeEditor 中编辑它之后尝试保留只读引用类型属性。

在我的 UITypeEditor 中,因为我使用的是只读属性,所以我小心地传回原始值(在更新相关子属性之后)。

此更改会立即反映在设计器上,但不会持续存在,除非我执行诸如调整属性附加到的控件的大小之类的操作。

为了解决这个问题,我盲目地在返回值之前包含对 context.OnComponentChanged() 的调用。

我明白为什么需要这样做。它是一个引用类型,我已经改变了它(没有替换它),并且属性网格不知道这一点。我有几个问题需要澄清:

我还需要调用 context.OnComponentChanging 吗?到目前为止,对 OnComponentChanged 的​​简单调用在我所做的测试中有效,但我不想在将来的某个时候咬屁股。

此外,在我调用 OnComponentChanging 时,是否存在任何危险,我将在 DesignerTransactions 中坚持我不应该坚持的其他组件?