WPF: как оформить класс как в css? - PullRequest
18 голосов
/ 04 марта 2011

Допустим, у меня есть UserControl с 4 границами:

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

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

Ответы [ 4 ]

16 голосов
/ 04 марта 2011

Хотя синтаксис не такой чистый, как в 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.

Более подробная справка по стилю: https://web.archive.org/web/20141210000517/http://dotnetslackers.com/articles/wpf/StylesResourcesAndControlTemplatesInWPF.aspx

10 голосов
/ 27 мая 2011

Большинство людей не знают, что 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, и вы сможете сделать несколько замечательных вещей.

2 голосов
/ 04 марта 2011
<Style x:Key="styleKey" TargetType="{x:Type Border}">
  ... change some properties here
</Style>

и

<Border Style="{StaticResource styleKey}"
1 голос
/ 04 марта 2011

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

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

<Border style="{StaticResource something}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...