2009-02-25 75 views
22

我想知道是否有方法將wpf樣式的basedOn屬性用於動態資源。例如在DynamicResources上使用BasedOn樣式屬性

<Style BasedOn="{DynamicResource somestyle}"> 
    <Setter Property="SomeProp" Value="SomeValue"/> 
</Style> 

這個例如拋出一個錯誤,指示動態資源與BasedOn樣式結合使用是不可能的。 我想知道有人能做到這一點? 感謝

回答

15

我認爲主要的原因是密封的對象。如果您有樣式層次結構:

 Style A 
    /  \ 
    Style A1 Style A2 

這可能不是一個難題。您使用動態資源參考StyleA,因此無論何時該資源發生更改,Style A1Style A2都應更改其BasedOn屬性。但是,一旦在您的應用程序中使用Style,它將成爲一個密封對象。 Style A變得不可變。您可以使用

一個解決辦法是:

  1. Style A需要改變。
  2. 創建一個新的Style對象,該對象將成爲新的Style A資源。
  3. 創建的Style A1Style A2一個新版本。你需要寫一個複製過程,使所有的SettersResources等設置BasedOnStyle A新版本的副本。
  4. 更新資源集合,使三種新的樣式在那裏。

{DynamicResource StyleA1}{DynamicResource StyleA2}現在應該選擇這些資源會改變(從第4步開始)並自動更新任何引用的事實。

請注意,這是一個非常簡單的場景。真實世界風格的層次結構可能更復雜,特別是如果它們分佈在多個文件中並來自合併字典。

希望我明白你的問題,並幫助。

+4

這種情況怎麼樣 - 一個不同的(Ux)團隊創建基本樣式......開發人員想要除了基本樣式之外還要設置幾個屬性。理想情況下,DevStyle BasedOn「DynamicResource UxStyle」會有幫助。如果這不可行,那麼在將兩種樣式應用於控件之前,有什麼替代方法? – Gishu 2012-10-14 07:07:48

12

我發現,因爲你不能在DynamicResource使用BasedOn,您可以通過合併ResourceDictionary牽着你的「父母」的資源來當前窗口/用戶控件/不管「轉換」的DynamicResourceStaticResource。通過這種方式,您現在可以使用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一個按鈕。

希望這會有所幫助!

相關問題