[英]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為什么不停止在應用程序級別搜索樣式?
這是因為默認(主題)樣式與普通樣式不同。
考慮“ 依賴項屬性”查找優先級列表 :
- 財產制度的強制。
- 活動動畫。
- 本地價值。
- TemplatedParent屬性。 來自TemplatedParent的觸發器和屬性集。
- 隱式風格。
Style
屬性的一種特殊情況。 在此,Style
屬性由任何樣式資源填充,且其鍵與該元素的類型匹配。 此查詢不會涉及主題 。- 樣式觸發器。 在頁面或應用程序的樣式內觸發。
- 模板觸發器。
- 樣式設置器。
- 默認(主題)樣式。
- 遺產。
- 依賴項屬性元數據中的默認值。
當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.