【问题标题】:Passing objects to a UITypeEditor将对象传递给 UITypeEditor
【发布时间】:2009-06-18 03:18:10
【问题描述】:

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

.

我的问题:要填充列表框,我需要访问管理 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 的上述方法或其他方法有什么想法吗?

感谢您的阅读。

【问题讨论】:

    标签: c# propertygrid uitypeeditor


    【解决方案1】:

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

    【讨论】:

    • 我当前的设计如下所示: MaterialDatabase:包含一个包含 Texture2D 类的材质字典。 GeometryDatabase:保存包含 GeometryData 的 StaticGeometryChunks 字典。 TileDatabase:保存一个 Tiles 字典,其中包含一个 StaticGeometryChunk 和一个 Material。创建这些类时,它们被传递一个树视图以显示它们已加载的内容,它在树视图上的选择触发属性网格以查看节点标记(对字典对象的引用)。我有一种感觉,这意味着上下文将是树视图?
    • 对不起,我的格式在上面消失了,我的字符用完了。谢谢回复。主要的整体类是 Tile,它们使用其他两个对象(材料/几何)作为其数据。这样一来,如果用户更改材质中的纹理,所有使用该材质的 Tiles 也会得到更改。稍微重新设计一下这个设置可以让我更轻松吗?
    • context.Instance 是该属性的所有者。在您的情况下,它将是材料。因此,这个 Material 类应该能够访问可能的纹理。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2016-07-12
      • 2018-11-09
      • 2012-03-04
      • 2016-04-01
      相关资源
      最近更新 更多