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

Dropdown Image.

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

现在,我已经为我自己的类解决了这个问题,方法是为它们的管理对象提供创建时的引用。然后,在 UITypeEditor 中,我使用该引用来访问我需要的内容。但是,我无法对我尚未编写的类(例如 XNA Texture2D 类)执行此操作。

我正在使用的类如下所示:

class StaticGeometryChunk
{
    // Geometry data to draw with. Contains a reference to its managing 
    // class for use in its UITypeEditor.
    public GeometryData { get; set; }
    ....
}

class Material
{
    // These are XNA classes. I can't just add a reference to its managing 
    // class (I think?).
    public Texture2D Texture1 { get; set; }
    public Texture2D Texture2 { get; set; }
    ....
}

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

  1. 使管理类静态。

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

  1. 使管理类成为单例。

我其实也不想这样做。这似乎是一种“隐藏”问题而不是“解决”问题的快速而肮脏的方法。我还可能希望选择在未来拥有多个管理类,而单例会消除这些类。

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

这就是我目前正在考虑做的事情。这将是非常简单和快速的事情,但有些事情让我烦恼,但我不知道是什么。

对于将我需要的内容传递到 UITypeEditor 中的上述或其他方法有何想法?

感谢您的阅读。

有帮助吗?

解决方案

在EditValue方法中,您将获得一个上下文。使用context.Instance访问保存属性的对象。此对象还应包含一个属性,使您可以访问要显示的事物列表。您可以测试context.Instance是否为ITextureProvider,然后将其转换并访问纹理。不确定这在你的设计中是否有意义,但请告诉我。

其他提示

作为替代方案,您可以尝试以下方法。我发现它非常优雅,因为它不需要在对象中存储可用属性值的列表。因此,例如,您可以在一个表单上显示一组值,在另一个表单上显示另一组值。

  1. 创建接口 IYourDataProviderService。
  2. 创建 IYourDataProviderService 的实现,它知道要提供的具体数据。
  3. 创建一个实现 ISite 的类。在 GetService() 方法中,如果 serviceType 参数是 typeof(IYourDataProviderService),则返回实现 IYourDataProviderService 的类的实例。我让其余的 ISite 方法抛出 NotImplementedException(DesignMode 属性除外),对我来说它有效,但这可能不是一个理想的解决方案。
  4. 在“Load”事件处理程序中,将您的实现分配给 propertygrid 的 Site 属性。
  5. 享受!
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top