我想知道是否有方法將wpf樣式的basedOn屬性用於動態資源。例如在DynamicResources上使用BasedOn樣式屬性
<Style BasedOn="{DynamicResource somestyle}">
<Setter Property="SomeProp" Value="SomeValue"/>
</Style>
這個例如拋出一個錯誤,指示動態資源與BasedOn樣式結合使用是不可能的。 我想知道有人能做到這一點? 感謝
我想知道是否有方法將wpf樣式的basedOn屬性用於動態資源。例如在DynamicResources上使用BasedOn樣式屬性
<Style BasedOn="{DynamicResource somestyle}">
<Setter Property="SomeProp" Value="SomeValue"/>
</Style>
這個例如拋出一個錯誤,指示動態資源與BasedOn樣式結合使用是不可能的。 我想知道有人能做到這一點? 感謝
我認爲主要的原因是密封的對象。如果您有樣式層次結構:
Style A
/ \
Style A1 Style A2
這可能不是一個難題。您使用動態資源參考StyleA
,因此無論何時該資源發生更改,Style A1
和Style A2
都應更改其BasedOn
屬性。但是,一旦在您的應用程序中使用Style,它將成爲一個密封對象。 Style A
變得不可變。您可以使用
一個解決辦法是:
Style A
需要改變。Style A
資源。Style A1
和Style A2
一個新版本。你需要寫一個複製過程,使所有的Setters
,Resources
等設置BasedOn
到Style A
新版本的副本。{DynamicResource StyleA1}
和{DynamicResource StyleA2}
現在應該選擇這些資源會改變(從第4步開始)並自動更新任何引用的事實。
請注意,這是一個非常簡單的場景。真實世界風格的層次結構可能更復雜,特別是如果它們分佈在多個文件中並來自合併字典。
希望我明白你的問題,並幫助。
我發現,因爲你不能在DynamicResource
使用BasedOn
,您可以通過合併ResourceDictionary
牽着你的「父母」的資源來當前窗口/用戶控件/不管「轉換」的DynamicResource
到StaticResource
。通過這種方式,您現在可以使用StaticResource
來引用資源對象(例如,Style
)。通過這種方式,您可以通過DynamicResource
(通過轉換)使用Datatriggers
。
實施例:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyProject.Styles;component/ButtonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
[*Your other resources can be put here*]
</ResourceDictionary>
</Window.Resources>
...
<Button Command="{Binding MyCommandInViewModel, RelativeSource={RelativeSource AncestorType=Window}}">
<Button.Style>
<Style BasedOn="{StaticResource StyleFromButtonStyles}" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding SomeBool}" Value="True">
<Setter Property="Button.Content" Value="{StaticResource SomeImage}"/>
</DataTrigger>
<DataTrigger Binding="{Binding SomeBool}" Value="False">
<Setter Property="Button.Content" Value="{StaticResource SomeOtherImage}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
因此Datatriggers
被施加到在導入的樣式ResourceDictionary
一個按鈕。
希望這會有所幫助!
這種情況怎麼樣 - 一個不同的(Ux)團隊創建基本樣式......開發人員想要除了基本樣式之外還要設置幾個屬性。理想情況下,DevStyle BasedOn「DynamicResource UxStyle」會有幫助。如果這不可行,那麼在將兩種樣式應用於控件之前,有什麼替代方法? – Gishu 2012-10-14 07:07:48