【问题标题】:Load control style from separate file in wpf从 wpf 中的单独文件加载控件样式
【发布时间】:2012-06-11 10:07:31
【问题描述】:

我的 Windows.Resources 添加了以下样式

<Window.Resources>
...
<!--A Style that extends the previous TextBlock Style-->
<!--This is a "named style" with an x:Key of TitleText-->
<Style BasedOn="{StaticResource {x:Type TextBlock}}"
   TargetType="TextBlock"
   x:Key="TitleText">
<Setter Property="FontSize" Value="26"/>
<Setter Property="Foreground">
 <Setter.Value>
  <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
    <LinearGradientBrush.GradientStops>
      <GradientStop Offset="0.0" Color="#90DDDD" />
      <GradientStop Offset="1.0" Color="#5BFFFF" />
    </LinearGradientBrush.GradientStops>
  </LinearGradientBrush>
  </Setter.Value>
</Setter>
</Style> 
...
</Window.Resources>

我的 xaml 代码中有很多这样的样式,我想将每个组件样式保存到一个额外的文件(不是外部文件)中。例如,与 TextBlocks 相关的所有样式都应该在一个名为 @ 的文件中987654322@

我将如何在 wpf 中执行此操作?

如何在我的项目中链接样式?

提前致谢

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    您使用合并的资源字典

    在你的 app.xaml 中你会使用

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary 
                    Source="/Your.Assembly.Name;component/TextBlockStyles.xaml"/>
                ... other dictionaries here
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    

    或直接进入 UserControl 将是

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary 
                    Source="/Your.Assembly.Name;component/TextBlockStyles.xaml"/>
                ... other dictionaries here
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    

    如果文件位于同一程序集和项目的根目录中,则可以将 Source="..." 缩短为 Source="TextBlockStyles.xaml",或者如果将资源字典放入文件夹 Styles,则可以缩短 Source="Styles\TextBlockStyles.xaml"

    【讨论】:

    • 那么TextBlockStyles.xaml这个文件长什么样子?
    • @TheMuffinMan:一个例子can be found here。 (在本例中称为Dictionary1.xaml。)
    • 不要忘记添加对定义样式的 dll 的引用。
    【解决方案2】:

    用例:您有一个名为MyView.xaml 的用户控件,带有一个按钮。您想使用外部 XAML 文件设置按钮样式。


    MyView.xaml:

    <User Control ...namespaces...>
        <UserControl.Resources>
            <ResourceDictionary>
                ...converters...
    
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="MyButton.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </UserControl.Resources>
    
         ...the rest of the control...
    </UserControl>
    

    MyButton.xaml:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:MSDNSample">
    
        <Style x:Key="FooButton" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Pink" />
        </Style>
    </ResourceDictionary>
    

    返回MyView.xaml(“其余控件”):

    <Button Style="{StaticResource FooButton}">
        Hello World
    </Button>
    

    【讨论】:

      【解决方案3】:

      Solution Explorer 中右键单击您的 Project 选择 Add 然后单击 Resource Dictionary... 选择名称并添加到您的项目中。 打开 App.xamlApplication 标签中添加此代码

      <Application.Resources>
          <ResourceDictionary>
              <ResourceDictionary.MergedDictionaries>
                  <ResourceDictionary Source="YourStyle.xaml" />
              </ResourceDictionary.MergedDictionaries>
          </ResourceDictionary>
      </Application.Resources>
      

      在 YourStyle.xaml 中:

      <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      xmlns:local="clr-namespace:APPNAME">
          <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
              <Setter Property="Background" Value="Pink" />
          </Style>
      </ResourceDictionary>
      

      【讨论】:

        【解决方案4】:

        您正在寻找动态资源。最好的方法是在资源中加载和标记字典。应用程序或在控制页面上。 这是一个很好的示例。

        http://blogs.msdn.com/b/wpfsdk/archive/2007/06/08/defining-and-using-shared-resources-in-a-custom-control-library.aspx

        <ResourceDictionary>
        
          <ResourceDictionary.MergedDictionaries>
        
            <ResourceDictionary Source="Dictionary1.xaml"/>
        
          </ResourceDictionary.MergedDictionaries>
        
        </ResourceDictionary>
        

        this.Resources.MergedDictionaries.Add(Smyresourcedictionary);

        【讨论】:

          【解决方案5】:

          简单地说,转到您想要包含外部文件中的资源的窗口(例如:MaindWindow.xaml)并使用MergedDictionaries 原则来引用该文件:

          <Window x:Class="UseMergedResource.MainWindow"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                  mc:Ignorable="d"
                  Title="MainWindow"
                  Height="600"
                  Width="600">
            <Window.Resources>
          
              <!-- DECLARING MERGED DICTIONARY --> 
              <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                  <ResourceDictionary Source='Merged/BrushResources.xaml' />
                </ResourceDictionary.MergedDictionaries>
              </ResourceDictionary>
              <!----------------------------------> 
          
            </Window.Resources>
          
          
            <StackPanel>
              <Rectangle Width='200'
                         Height='100'
                         Fill='{StaticResource PrimaryBrush}' /> <!-- USAGE HERE -->
            </StackPanel>
          </Window>
          

          上面Merged/BrushResources.xaml是资源文件的位置,位于名为Merged的文件夹下。

          现在,如果您想知道外部文件中的声明语法应该是什么,请检查:

          <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                                                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
          
              <!-- Location for application brushes -->
              <SolidColorBrush x:Key='BorderBrush'
                                               Color='Orange' />
              <SolidColorBrush x:Key='HighLightBrush'
                                               Color='LightBlue' />
              <SolidColorBrush x:Key='PrimaryBrush'
                                               Color='Pink' />
              <SolidColorBrush x:Key='AccentBrush'
                                               Color='Yellow' />
          
          </ResourceDictionary>
          

          如果您想让资源在所有应用程序中都可用(在所有窗口中可见),请在 App.xaml 资源部分声明。

          【讨论】:

            猜你喜欢
            • 2011-12-07
            • 1970-01-01
            • 1970-01-01
            • 2016-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-30
            • 1970-01-01
            相关资源
            最近更新 更多