2016-02-26 5 views
0

У меня есть библиотека управления с таможенным контролем:Как я могу сделать Custom Control автоматически применять стиль, определенный в словаре ресурсов?

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> 

I «Мне удалось это сделать раньше, но это знание потерялось для меня.

Как я могу это сделать? (Я отлично вношу изменения в код моего контроля).

ответ

1

Мне пришлось заново вспомнить, как это работало неделю назад, и это то, что я должен был сделать, чтобы он работал для меня. Типичным способом с пользовательскими элементами управления является определение стиля в файле с именем generic.xaml, находящимся в папке Themes, прямо под вашим корнем проекта. Затем вам необходимо переопределить стиль по умолчанию в статическом конструкторе вашего настраиваемого класса управления. Это будет выглядеть примерно так:

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

 Смежные вопросы

  • Нет связанных вопросов^_^