WPF: как создать класс, как в css?

Скажем, у меня есть UserControl с 4 Borders:

<Border />
<Border />
<Border />
<Border />

Теперь в моих ресурсах я могу пойти:

<Style TargetType="{x:Type Border}">
  ... change some properties here
</Style>

Теперь это все хорошо, но он будет нацелен на все границы моего UserControl. Но что, если я просто хочу настроить их подмножество?

Мне бы хотелось:

<Border Class="Type1" />
<Border Class="Type1" />
<Border />
<Border />

И затем идите:

<Style TargetType="{x:Type Border}" TargetClass="Type1">
  ... change some properties here
</Style>

Но этого, очевидно, не существует, есть ли другой способ добиться того, что мне нужно? Благодаря

Ответы

Ответ 1

Хотя синтаксис не так чист, как в CSS, это гораздо более конкретный.

Чтобы опираться на ваш пример, вы ищете:

<Border Style="{StaticResource Type1}" />
<Border Style="{StaticResource Type1}" />
<Border />
<Border />

И затем идите:

<Style TargetType="{x:Type Border}" x:Key="Type1">
  ... change some properties here
</Style>

Помните, что стили WPF на самом деле не каскадируются, как CSS.

Более подробная ссылка на стиль: http://dotnetslackers.com/articles/wpf/StylesResourcesAndControlTemplatesInWPF.aspx

Ответ 2

Что-то, что я считаю большинством людей, не знает о способности WPF встраивать стили в Style.Resources. Например:

<!-- Define a new style for Borders called InfoBox, that will have a red background, 
     and further override all buttons within it to have Yellow Text.  An extra style,
     "Strawberry" is also defined, that lets specific buttons be selected to be styled
     as Green FG on DarkRed BG -->
<Style TargetType="{x:Type Border}" x:Key="InfoBox">
  <Setter Property="Background" Value="Red"/>
  <Style.Resources>
    <Style TargetType="{x:Type Button}">
      <Setter Property="Foreground" Value="DarkYellow"/>
    </Style>
    <Style TargetType="{x:Type Button}" x:Key="Strawberry">
      <Setter Property="Foreground" Value="Green"/>
      <Setter Property="Background" Value="DarkRed"/>
    </Style>
  </Style.Resources>
</Style>

...

<Border Style="{DynamicResource InfoBox}">
   <StackPanel>
     <Button Content="I am a banana!"/>
     <Button Style="{DynamicResource Strawberry}" Content="I am red!"/>
   </StackPanel>
</Border>

В то время как не совсем то же самое, что и CSS (поддержка стандартных псевдо-селекторов невелика), это дает вам огромную мощность и гибкость. Соедините это с умелым использованием ItemsControls, и вы сможете сделать что-то замечательное.

Ответ 3

<Style x:Key="styleKey" TargetType="{x:Type Border}">
  ... change some properties here
</Style>

и

<Border Style="{StaticResource styleKey}"

Ответ 4

вы можете установить стиль непосредственно на <Border>, используя ключ x: и свойство StaticResource (или DynamicResource) для Border. если вы хотите изменить стиль во время выполнения, тогда вы должны опираться на использование DynamicResource поверх StaticResource.

<Style x:Key="something" TargetType="{x:Type Border}">
</Style>

<Border style="{StaticResource something}"/>