Стиль управления загрузкой из отдельного файла в 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);