簡體   English   中英

如何使 WPF 樣式可繼承給派生類?

[英]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.

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