Подтвердить что ты не робот

Можете ли вы определить несколько 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?

4b9b3361

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