Стиль управления загрузкой из отдельного файла в 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, должны быть в файле TextBlockStyles.xaml

Как мне это сделать в 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" если файл находится в одной и той же сборке и в корне проекта, или, альтернативно, Source="Styles\TextBlockStyles.xaml" если вы положили ресурсный словарь в папку " Styles.

Ответ 2

В обозревателе решений щелкните правой кнопкой мыши на своем проекте. Выберите " Добавить". После этого нажмите " Словарь ресурсов"... Выберите имя и добавьте в свой проект. Открыть 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>

Ответ 3

Случай использования: у вас есть пользовательский элемент управления 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>

Ответ 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);