从wpf中的单独文件加载控件样式

时间:2012-06-11 10:07:31

标签: c# wpf

我将以下样式添加到我的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相关的所有样式都应该在一个名为{的文件中{1}}

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

如何链接项目中的样式?

提前致谢

5 个答案:

答案 0 :(得分:21)

您使用合并资源词典

在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",如果将资源字典放入文件夹,则可以Source="Styles\TextBlockStyles.xaml" Styles

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用案例:您有一个名为InuReading& InuTask::newReading(String t, String l){ readings.push_back(InuReading(t, l); return readings.back(); } 的用户控件,带有一个按钮。您希望使用外部XAML文件设置按钮的样式。

MyView.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

答案 3 :(得分:0)

解决方案资源管理器中,右键单击您的项目,然后选择添加,然后单击资源字典... 。 选择名称并添加到您的项目。 打开 App.xaml 应用标签

中添加此代码
<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 :(得分:0)

简单地,转到您的窗口(示例: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资源部分中声明。