2009-06-18 239 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. 享受!