Загрузка стиля WPF из файла ресурсов

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

Решение содержит два проекта

  1. WpfTestControls библиотеки пользовательских элементов управления типа WPF

  2. WpfTestApp типа библиотеки приложений WPF, которая имеет ссылку на WpfTestControls

MainWindow.xaml из библиотеки приложений WPF

<Window.Resources>
    <Style x:Key="TempStyle" TargetType="{x:Type TextBox}">
        <Setter Property="BorderBrush" Value="Green"/>
    </Style>
</Window.Resources>
<Grid>
    <TextBox Height="50px" Width="100px" Style="{DynamicResource TempStyle}"/>
</Grid>

Generic.xaml из библиотеки пользовательских элементов управления WPF

<ResourceDictionary
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/WpfTestControls;component/TextBoxStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>

TextBoxStyle.xaml из библиотеки пользовательских элементов управления WPF

<ResourceDictionary 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="TempStyle" TargetType="{x:Type TextBox}">
    <Setter Property="BorderBrush" Value="Green"/>
</Style>

Мой файл AssemblyInfo.cs содержит следующее

[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

Но я все еще не могу загрузить Стиль. Если я использую не Generic.xaml все работает нормально, например, следующий код работает как ожидалось

<Window x:Class="WpfTestApp.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>
    <Style x:Key="TempStyle" TargetType="{x:Type TextBox}">
        <Setter Property="BorderBrush" Value="Green"/>
    </Style>
</Window.Resources>
<Grid>
    <TextBox Height="50px" Width="100px" Style="{StaticResource TempStyle}"/>
</Grid>

Что я делаю неправильно? заранее спасибо

2 ответа

Пожалуйста, ответьте несколько вещей для меня...

  1. Является ли сборка "Библиотека пользовательских элементов управления WPF" такой же, как сборка "WpfTestControls"?
  2. Если нет, то имеет ли "Библиотека пользовательских элементов управления WPF" ссылку на сборку "WpfTestControls"?
  3. Ваш WpfTestApp есть ссылка на сборки "Библиотека пользовательских элементов управления WPF" и "WpfTestControls"?

Если вы добавите эти ссылки, ресурсы должны загружаться правильно.

Мои шаги...

  1. Добавьте "Библиотека пользовательских элементов управления WPF", скажем "ThemesLibray"
  2. В этом добавить два словаря ресурсов в папке "Темы"

TextBoxStyle.xaml

 <ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="GreenTextBoxStyle" TargetType="{x:Type TextBox}">
       <Setter Property="Background" Value="Green"/>
    </Style>
 </ResourceDictionary>

Generic.xaml

  <ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
         <ResourceDictionary Source="TextBoxStyle.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
  1. У меня есть главный стартовый проект "MyWPFTestApp", который имеет ссылку на сборку ThemesLibray, В этом окне есть ThemesLibrary ресурсы слились таким образом....

    <Window x:Class="MyWPFTestApp.Window7"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window7" Height="300" Width="300">
        <Window.Resources>
            <ResourceDictionary>
               <ResourceDictionary.MergedDictionaries>
                   <ResourceDictionary
                       Source="/ThemseLibrary;component/Themes/Generic.xaml"/>    
               </ResourceDictionary.MergedDictionaries>            
            </ResourceDictionary>
        </Window.Resources>
        <Grid>
            <TextBox Style="{StaticResource GreenTextBoxStyle}"/>
        </Grid>
     </Window>
    

Когда я запускаю MyWPFTestApp, я вижу окно с зеленым TextBox.

Главное: удостоверьтесь, что у вас есть Build Action вашего Resource Dictionary для Resource.

Другие вопросы по тегам