Можете ли вы определить несколько TargetTypes для одного стиля XAML?
В HTML/CSS вы можете определить стиль, который может применяться ко многим типам элементов, например:
.highlight {
color:red;
}
может применяться как к P, так и к DIV, например:
<p class="highlight">this will be highlighted</p>
<div class="highlight">this will also be highlighted</div>
но в XAML вам, похоже, нужно определить TargetType для стилей, иначе вы получите сообщение об ошибке:
<Style x:Key="formRowLabel" TargetType="TextBlock">
Есть ли способ разрешить стиль XAML применяться к нескольким элементам или даже оставить его открытым, как в CSS?
Ответы
Ответ 1
Установки в стилях WPF проверяются во время компиляции; Стили CSS применяются динамически.
Вы должны указать тип, чтобы WPF мог разрешить свойства в сеттерах для свойств зависимостей этого типа.
Вы можете установить целевой тип базовым классам, которые содержат нужные вам свойства, а затем применить этот стиль к производным классам. Например, вы можете создать стиль для объектов Control, а затем применить его к нескольким типам элементов управления (Button, TextBox, CheckBox и т.д.).
<Style x:Key="Highlight" TargetType="{x:Type Control}">
<Setter Property="Foreground" Value="Red"/>
</Style>
...
<Button Style="{StaticResource Highlight}" Content="Test"/>
<TextBox Style="{StaticResource Highlight}" Text="Test"/>
<CheckBox Style="{StaticResource Highlight}" Content="Test"/>
Ответ 2
<!-- Header text style -->
<Style x:Key="headerTextStyle">
<Setter Property="Label.VerticalAlignment" Value="Center"></Setter>
<Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter>
<Setter Property="Label.FontWeight" Value="Bold"></Setter>
<Setter Property="Label.FontSize" Value="18"></Setter>
<Setter Property="Label.Foreground" Value="#0066cc"></Setter>
</Style>
<!-- Label style -->
<Style x:Key="labelStyle" TargetType="{x:Type Label}">
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Margin" Value="0,0,0,5" />
</Style>
Я думаю, что оба этих метода объявления стиля могут ответить на ваш вопрос.
В первом нет указанного TargetType, но имена свойств имеют префикс "Label". Во втором стиле создается для объектов Label.
Другой способ сделать это:
<UserControl.Resources>
<Style x:Key="commonStyle" TargetType="Control">
<Setter Property="FontSize" Value="24"/>
</Style>
<Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/>
<Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/>
</UserControl.Resources>
Ответ 3
Существует альтернативный ответ на вопрос. Вы можете полностью отключить параметр TargetType от стиля, который позволит ему применяться к различным различным элементам управления, но только если вы префикс имени свойства "Control".
<Style x:Key="Highlight">
<Setter Property="Control.Foreground" Value="Red"/>
</Style>
Очевидно, что это работает только для свойств базового класса управления. Если вы попытались установить параметр ItemsSource, он потерпит неудачу, потому что нет Control.ItemsSource
Ответ 4
Я хотел применить стиль к Textblock и TextBox, но выбранный ответ не работал у меня, потому что Textblock не наследует Control, в моем случае я хотел повлиять на свойство Visibility, поэтому я использовал FrameworkElement
<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>
Это работает для свойства Видимость, потому что оба элемента наследуются от Frameworkelement и свойство определено там. Конечно, это не будет работать для свойств, определенных только в Control, вы можете искать дерево иерархии и пытаться найти базовый класс, так или иначе, я думал, что это может помочь кому-то, поскольку это лучший результат поиска, а выбранный ответ немного неполный.
Ответ 5
Я получил эту работу
<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}">
<Setter Property="Background" Value="Black" />
<Style.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background=" Value="Red" />
</Style>
</Style.Resources>
</Style>