Можете ли вы определить несколько типов TargetTypes для одного стиля XAML? - PullRequest
58 голосов
/ 29 апреля 2009

В 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?

Ответы [ 5 ]

67 голосов
/ 29 апреля 2009

Установщики в стилях 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"/>
35 голосов
/ 15 октября 2012
<!-- 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>
4 голосов
/ 13 августа 2015

Я хотел применить стиль к текстовому блоку и текстовому блоку, но выбранный ответ не работал для меня, потому что текстовый блок не наследуется от элемента управления, в моем случае я хотел повлиять на свойство видимости, поэтому я использовал 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}"/>

Это работает для свойства Visibility, поскольку оба элемента наследуются от Frameworkelement, а свойство определяется там. Конечно, это не будет работать для свойств, определенных только в Control, вы можете искать в дереве иерархии и пытаться найти базовый класс, в любом случае, я подумал, что это может кому-то помочь, так как это лучший результат поиска, а выбранный ответ немного неполон.

3 голосов
/ 02 июля 2012

Есть альтернативный ответ на вопрос. Вы МОЖЕТЕ вообще оставить параметр TargetType вне стиля, что позволит применять его к различным элементам управления, но только если вы добавите префикс имени свойства «Control».

<Style x:Key="Highlight">
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

Очевидно, это работает только для свойств базового класса управления. Если вы попытаетесь установить сказать ItemsSource, произойдет сбой, потому что нет Control.ItemsSource

0 голосов
/ 15 ноября 2011

Я получил это работает

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...