2012-02-02 61 views
1

當某些需要皮膚修改的項目不支持DynamicResourceExtention類型的值時,啓用WPF應用程序的動態蒙皮的最佳方式是什麼?特別是,我們的問題是ConverterParameters需要StaticResourceExtentions。如何爲ConverterParameters啓用動態蒙皮

下面是使用Visual Studio 2008和WPF 3.5的ConverterParameters的情況。

我們有一個自定義轉換器,它需要一個值和一個參數,並簡單地返回他們的產品。 非常簡單,工作正常,我們將其用於各種任務,包括設置一些窗口元素大小。例如,傳遞一個值「Source = {x:Static SystemParameters.PrimaryScreenHeight}」和一個參數「0.1」,使我們可以將元素的高度設置爲屏幕高度的1/10。

Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, 
        Converter={StaticResource PctConverter}, 
        ConverterParameter=0.1}" 

其中PctConverter是我們的自定義轉換器的資源引用。那裏沒問題。

現在我們想通過提取ConverterParameter並將其放入單獨的資源來動態地對應用程序進行皮膚處理。例如,我們可能希望元素高度在某些皮膚中爲屏幕高度的0.1倍,並且在其他皮膚高度中爲0.25。起初,我們以爲我們會簡單地設置ConverterParameter到DynamicResource,但這是不支持的,所以我們必須用這樣的StaticResourceExtension設置它:

Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, 
      Converter={StaticResource PctConverter}, 
      ConverterParameter={StaticResource OurElementHeightParameter}}" 

其中OurElementHeightParameter是在一個單獨的ResourceDictionary定義(稱之爲MainResource.xaml)如下:

<sys:Double x:Key="OurElementHeightParameter">0.1</sys:Double> 

(其中的名稱空間定義爲的xmlns:SYS = 「CLR-命名空間:系統;裝配= mscorlib程序」)

這工作得很好,據提取。 CustomParameter關注,但它仍然並未使我們能夠通過即時交換外觀來更改我們的ConverterParameter。

研究這個更多一些,特別是下面的文章

How to assign wpf resources to other resource tags

Skinning using a color as staticresource for another color

Aliasing resources

我們認爲我們需要做的,現在是把我們的StaticResourceExtention並將其值設置後動態地在幕後使用資源別名。

試圖做到這一點,我們取代了以往OurElementHeightParameter資源有以下兩種資源

工作正常,產生相同的結果。

當那效果不錯,我們認爲這將是放置SkinnedHeightRatio資源在一個單獨的ResourceDictionary(稱之爲Skin.xaml)和合並與原來的MainResource.xaml ResourceDictionary中的簡單的事情,我們將擁有動態換膚我們在之後。

但是,只要我們提取<sys:Single x:Key="SkinnedHeightRatio">0.1</sys:Single>到我們遇到如下建立自己的錯誤另一個ResourceDictionary中:

未知的生成錯誤,「索引超出範圍。必須是非負面的,並且小於收藏的大小。「

更爲奇怪的是,如果我們保持兩個資源與上述相同的ResourceDictionary中,只是通過將它們之間的另一個隨機資源,例如

<sys:Double x:Key="SkinnedHeightRatio">0.1</sys:Double> 
<Thickness x:Key="SomeRandomResource" >5</Thickness> 
<StaticResourceExtension x:Key="OurElementHeightParameter" ResourceKey="SkinnedHeightRatio" /> 

那麼OurElementHeightParameter指向SomeRandomResource正上方它們分開它並不是在其ResourceKey屬性(SkinnedHeightRatio)中指定的資源,它只在其上面2行... 在這種情況下,傳遞給轉換器的參數是厚度SomeRandomResource。

所有非常混亂,並使我們認爲我們完全吠叫錯誤的樹。那麼我們哪裏錯了?

如果任何人需要完整的代碼來重現問題的應用程序,我可以發佈它。

任何指針非常讚賞。

回答

0

創建多值轉換器並將其綁定到兩個值可能會更簡單。

+0

我認爲你是對的。感謝您對遲到的回覆進行回覆和抱歉(這個問題沒有得到答覆這麼長時間了,它已經被忽略了!) – Nick 2012-10-19 22:35:18