[英]How to make a WPF style inheritable to derived classes?
在我們的 WPF 應用程序中,我們有一個具有TargetType={x:Type ContextMenu}
的全局樣式。 我創建了一個派生自 ContextMenu 的 MyContextMenu,但現在默認樣式不適用。
如何告訴 WPF 我希望 MyContextMenu 從 ContextMenu 繼承默認樣式? 希望我可以在我的控制范圍內做到這一點(通過 static ctor 元數據覆蓋或其他東西?),而不必在任何 xaml 中亂來。
如果您在應用程序中定義了樣式,如下所示:
<Style TargetType="{x:Type ContextMenu}" ...
那么這是一個隱式樣式,而不是默認樣式。 默認 Styles 通常位於與控件相同的程序集或匹配程序集(即 MyAssembly.Aero.dll)中。
隱式 Styles 不會自動應用於派生類型,這可能就是您所看到的。
您可以定義第二個樣式,如下所示:
<Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}" ...
<Style TargetType="{x:Type local:MyContextMenu}" BasedOn="{StaticResource {x:Type ContextMenu}}" ...
或者,您可以利用控件的 Style 屬性。 您可以從 XAML 執行以下操作
<local:MyContextMenu Style="{DynamicResource {x:Type ContextMenu}}" ...
或者您可以在 MyContextMenu 中執行此操作,如下所示:
public MyContextMenu() {
this.SetResourceReference(StyleProperty, typeof(ContextMenu));
}
作為對 CodeNaked 出色建議的補充,我嘗試在 MyContextMenu 的MyContextMenu
部分中指定Style
:
<ContextMenu x:Class=LocalProject.MyContextMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:AdelSoft_WS_FRA_Test.Composants"
mc:Ignorable="d"
Style="{DynamicResource {x:Type ContextMenu}}">
編譯器警告我它無法解析資源,但在運行時它看起來非常有能力。
自然也可以使用
Style="{StaticResource ContextMenuStyleName}">
如果您使用樣式名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.