2009-06-18 241 views
5

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

谢谢您的阅读。

回答

9

在EditValue方法中,给定了一个上下文。使用context.Instance访问保存属性的对象。该对象还应该包含一个属性,使您可以访问要显示的内容列表。例如,你可以测试context.Instance是否为ITextureProvider,然后转换它并访问纹理。不知道这是否在你的设计中有意义,但让我知道。

+0

我目前的设计是这样的: MaterialDatabase:保存包含Texture2D类的材质字典。 GeometryDatabase:保存包含GeometryData的StaticGeometryChunk的字典。 TileDatabase:保存包含StaticGeometryChunk和材质的Tiles字典。 创建这些类时,会传递一个树视图来显示它们已加载的内容,它在树视图上的一个选择触发propertygrid以查看节点标记(对字典对象的引用)。 我有一种感觉,这意味着上下文将树视图? – Kath 2009-06-18 14:31:18

4

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

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