2016-02-26 60 views
0

我有一個自定義的控制的控制庫:如何使自定義控件自動應用資源字典中定義的樣式?

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> 

我以前能夠做到這一點,但知識似乎已經失去了我。

我該如何做到這一點? (我很好地對我的控制背後的代碼進行更改)。

回答

1

我不得不重新記住一週前的工作情況,而這正是我爲了讓它適合我而必須做的。自定義控件的典型方法是在位於項目根目錄下的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文件改變生成操作屬性頁之前的默認樣式會得到正確應用於我的控制。

+0

這是對的,是的;儘管我真的希望避免將XAML從CS文件中分離出來......也許有一種方法,但這絕對是我以前做過的。謝謝。 – Will

0

這項工作的最佳實踐是創建DictionaryResources包含您想要的每種應用程序風格的應用程序中的所有WPF樣式。 enter image description here

所以,你可以刪除當前的風格,並添加新的樣式動態象下面這樣:enter image description here

相關問題