从资源文件加载WPF样式

时间:2011-10-13 23:42:55

标签: wpf xaml custom-controls resourcedictionary generic.xaml

我正在尝试从WPF自定义控件库实际加载其他文件中的WPF Style 但我在这里没有加载是我的解决方案。

该解决方案包含两个项目

  1. WPF自定义控件库的WpfTestControl

  2. WPF应用程序库类型的WpfTestApp,它引用了WpfTestControls

  3. 来自WPF应用程序库的MainWindow.xaml

    <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>
    
    来自WPF自定义控件库的

    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="/WpfTestControls;component/TextBoxStyle.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    

    来自WPF自定义控件库的

    TextBoxStyle.xaml

    <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))]
    

    但我仍然无法加载Style。 如果我使用的不使用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 个答案:

答案 0 :(得分:5)

请为我回答一些事情......

  1. “WPF自定义控件库”程序集与“WpfTestControls”程序集相同吗?
  2. 如果没有,那么“WPF自定义控件库”是否引用了“WpfTestControls”程序集?
  3. 您的WpfTestApp是否同时引用了“WPF自定义控件库”和“WpfTestControls”程序集?
  4. 如果添加该引用,则应正确加载资源。

    我的步骤......

    1. 添加“WPF自定义控件库”,说“ThemesLibray”
    2. 在此添加“Themes”文件夹
    3. 下的两个资源词典

      <强> 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. 我有一个主要的starup项目“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>
        
      2. 当我启动MyWPFTestApp时,我看到带有绿色TextBox的窗口。

答案 1 :(得分:1)

主要是:确保将资源字典的构建操作设置为资源。