簡體   English   中英

如何使自定義控件自動應用資源字典中定義的樣式?

[英]How can I make a Custom Control automatically apply a style defined in a resource dictionary?

我有一個帶有自定義控件的控件庫:

public class GlassButton : Button {
}

並且我還定義了資源字典來設置控件的樣式:

<ResourceDictionary
    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:Animations="clr-namespace:WPFTools.Classes"
    xmlns:Controls="clr-namespace:WPFTools.Controls"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    mc:Ignorable="d">
    <Style TargetType="{x:Type Controls:GlassButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">

我希望能夠簡單地將GlassButton拖放到窗口或控件上,而不必這樣做:

<Window.Resources>
    <ResourceDictionary Source="Foo"/>
</Window.Resources>

我以前曾經做過一次,但是那知識似乎已經對我丟失了。

我怎樣才能做到這一點? (我很好地更改了控件背后的代碼)。

我不得不記得一個星期前它是如何工作的,這是我必須做的才能使其對我有用。 使用自定義控件的典型方法是在項目根目錄下“ Themes文件夾中的名為generic.xaml的文件中定義樣式。 然后,您需要在自定義控件類的靜態構造函數中覆蓋默認樣式。 它看起來像這樣:

public class GlassButton : Button
{
    static GlassButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata( typeof( GlassButton ),
            new FrameworkPropertyMetadata( typeof( GlassButton ) ) );
    }
}

最后,您需要設置適當的程序集屬性以說通用主題位於程序集中。 這樣的事情會出現在您的Properties\\AssemblyInfo.cs文件中:

using System.Windows;
[assembly:ThemeInfo( ResourceDictionaryLocation.None,
    ResourceDictionaryLocation.SourceAssembly )]

我不確定這是否絕對必要,但是在將默認樣式正確應用於控件之前,我還必須將generic.xaml文件上的“生成操作”屬性更改為Page。

這項工作的最佳實踐是創建DictionaryResources,其中包含您想要的每種應用程序樣式的應用程序中的所有WPF樣式。 在此處輸入圖片說明

因此,您可以刪除當前樣式並動態添加新樣式,如下所示: 在此處輸入圖片說明

暫無
暫無

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

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