2015-05-05 5 views
1

Я пытаюсь поместить свои стили WPF в отдельную библиотеку, но немного не понял, как это лучше всего достичь. Это то, что я сделал до сих пор:Как создать пользовательскую библиотеку стилей WPF

  1. Создан новый проект библиотеки классов и добавлены ссылки PresentationCore, PresentationFramework, System.Xaml и WindowsBase
  2. Созданный файл " MyStyles.xaml "в этом библиотечном проекте этого класса с следующего содержания:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    
        <Style TargetType="Button" x:Key="MyButtonStyle"> 
         <Setter Property="Background" Value="Transparent"/> 
        </Style> 
    </ResourceDictionary> 
    
  3. Построен проект.

  4. Создал новый проект приложения WPF и обратился к библиотеке , построенной выше.

  5. В App.xaml пытались ссылаться на словарь ресурсов в libarary следующим образом:

    `<ApplicationResources> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
         <ResourceDictionary Source="pack://application:,,,/MyCustomWpfStyles;component/MyStyles.xaml"/> 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    

    `

  6. В этой точке В. С. IntelliSense говорит о том, что произошла ошибка во время нахождения ресурса словарь, хотя приложение создает без проблем.

  7. Даже если я в состоянии загрузить словарь ресурсов, я не знаю, как использовать его с контролем, например, <Button Style="What goes here??" />

Посмотрел через Интернет, но не могу чтобы найти хороший пример того, как упаковывать стили в отдельную dll. Любые указатели?

ответ

2
  1. Не слепо доверять VS intelli-sense, чтобы давать вам правильные сообщения об ошибках в любое время. Возможно, что-то не так, но я видел, что VS не может обрабатывать несколько проектов в одном и том же решении при любых обстоятельствах. Игнорируйте сейчас, если это всего лишь предупреждение. Если это правильная ошибка, и она не может скомпилировать, создайте библиотеку управления в отдельном решении и установите правильную ссылку на DLL в клиентском приложении.

  2. Использование Style="{StaticResource MyButtonStyle}"

также взглянуть на ResourceDictionary in a separate assembly Это объясняет, как использовать ресурсы в других типах узлов и в других местах.

Вот код, который работает на моей машине:

В проекте WpfControlLibrary1 библиотеки классов, файл в корневой папке с именем «Dictionary1.xaml»:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="Button" 
      x:Key="Demo1"> 
     <Setter Property="BorderBrush" 
       Value="Red" /> 
     <Setter Property="BorderThickness" 
       Value="10" /> 
     <Setter Property="Background" 
       Value="Transparent" /> 
    </Style> 
</ResourceDictionary> 

Отметим, что установка свойства фона может не работать, когда шаблон, используемый для рисования кнопки, не использует свойство Background. Шаблон кнопки fancy gradient, который использует WPF в Windows 7, не делает этого, а плоский в Windows 8.1 делает. Вот почему я добавил большую красную рамку, чтобы стиль мог отображаться частично.

В другом решении, приложение Wpf со ссылкой на предыдущей DLL (не проект)

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="350" 
     Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Dictionary1.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <Button Content="Button" 
       Style="{StaticResource ResourceKey=Demo1}" 
       HorizontalAlignment="Left" 
       Margin="139,113,0,0" 
       VerticalAlignment="Top" 
       Width="75" /> 
    </Grid> 
</Window> 

Перемещение объединенного словаря для объекта приложения работает хорошо:

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/WpfControlLibrary1;component/Dictionary1.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 
+0

Кроме того, если вы хотите, чтобы все ваши кнопки имели стиль, который вы определили, просто опустите атрибут 'x: Key'. – Gimly

+0

Спасибо. Тем не менее, радости здесь нет. Пока приложение строит, независимо от того, какой цвет я устанавливаю для фона в MyStyles.xaml, я никогда не получаю его в своем приложении WPF. Не могу помочь, я пропустил что-то простое - знаете ли вы о хороших примерах того, как это сделать? –

+0

@JamesB - Я добавил рабочий пример к моему ответу. Убедитесь, что все пути и имена верны. –