簡體   English   中英

在generic.xaml中定義的覆蓋樣式將導致合並樣式

[英]overriding styles defined in generic.xaml results in merged style

我有一個在單獨的資源字典中定義的樣式的控件,並使用generic.xaml魔術應用了它。

如果我了解msdn( https://msdn.microsoft.com/de-de/library/ms750613%28v=vs.110%29.aspx )上描述的查找機制,則在應用程序資源之后使用了generic.xaml,但是為MyWindow添加樣式將導致通用樣式xaml + App.xaml中定義的樣式。

這是我的代碼:

Generic.xaml

<ResourceDictionary ...>
   <Style TargetType="{x:Type test:MyWindow}" BasedOn="{StaticResource ResourceKey={x:Type Window}}">
        <Setter Property="Background" Value="Gainsboro" />
        <Setter Property="Title" Value="Default!" />
   </Style>
</ResourceDictionary>

App.xaml中

<Application.Resources>
     <ResourceDictionary>
         <Style TargetType="{x:Type test:MyWindow}" BasedOn="{StaticResource ResourceKey={x:Type Window}}">
            <Setter Property="Background" Value="HotPink" />
         </Style>
</Application.Resources>

該窗口將具有粉紅色背景(來自application.resource樣式)和“默認!” 作為generic.xaml樣式的標題。

wpf為什么不停止在應用程序級別搜索樣式?

這是因為默認(主題)樣式與普通樣式不同。

考慮“ 依賴項屬性”查找優先級列表

  1. 財產制度的強制。
  2. 活動動畫。
  3. 本地價值。
  4. TemplatedParent屬性。 來自TemplatedParent的觸發器和屬性集。
  5. 隱式風格。 Style屬性的一種特殊情況。 在此, Style屬性由任何樣式資源填充,且其鍵與該元素的類型匹配。 此查詢不會涉及主題
  6. 樣式觸發器。 在頁面或應用程序的樣式內觸發。
  7. 模板觸發器。
  8. 樣式設置器。
  9. 默認(主題)樣式。
  10. 遺產。
  11. 依賴項屬性元數據中的默認值。

當WPF確定MyWindow.Style的值時,它將通過優先級列表並決定使用“ 5.隱式樣式”進行分配。 因此,然后在App.xaml中找到匹配的樣式並使用它。 如果在運行時檢查MyWindow的屬性,則實際上應該看到MyWindow.Style已設置為App.xaml中的MyWindow.Style 因此,WPF實際上確實停止了在應用程序級別上搜索樣式。

只是由於DefaultStyleKeyProperty ,所以DependencyProperty查找列表中仍存在默認樣式,盡管其優先級低於App.xaml樣式。

在這種情況下,App.xaml不會設置Title屬性,因此DependencyProperty引擎將退回到Generic.xaml中的默認樣式以提供一個值。 因此,這就是您獲得合並樣式行為的原因。

當然,請注意,只有在正確設置 Generic.xaml魔術后,才會發生這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM