Применение одного стиля к нескольким элементам управления (и настройка каждого стиля) - PullRequest
3 голосов
/ 22 декабря 2008

У меня есть приложение WPF, использующее собственный стиль. В нем у меня есть набор кнопок, каждая из которых имеет свое собственное фоновое изображение. Для каждой кнопки я предоставляю нормальное изображение и изображение мышью вниз. Есть ли простой способ сделать это с помощью одного стиля (и настраивать каждую кнопку для каждого конкретного случая)?

В настоящее время я создаю новый стиль для каждой кнопки, и это не может быть лучшим способом сделать это наверняка?

Ответы [ 2 ]

11 голосов
/ 22 декабря 2008

Для решения только на XAML вы можете рассмотреть это: -

Я предполагаю, что вы используете шаблон элемента управления как часть вашего стиля, например: -

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Image x:Name="img" Style="{DynamicResource NormalImage}"/>
        <ControlTemplate.Triggers>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Source" TargetName="img" Value="Images\DisabledImage.png"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Я вырезал здесь шаблон управления, и ваш может быть более сложным

Теперь, если вы добавите следующий стиль в той же области, что и вышеприведенный стиль, тогда будет указано изображение, которое будет использоваться для случая по умолчанию

<Style x:Key="NormalImage" TargetType="{x:Type Image}">
  <Setter Property="Source" Value="Images/DeafultImage.png"/>
</Style>

Далее в вашем XAML, когда вам нужно использовать кнопку, вы можете сделать это: -

<Button Style="{DynamicResource MyButtonStyle}" >
  <Button.Resources>
    <Style x:Key="NormalImage" TargetType="{x:Type Image}">
      <Setter Property="Source" Value="Images/OverrideImage.png"/>
    </Style>
  </Button.Resources>
</Button>

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

Способ, которым это работает, заключается в том, что имя ресурса «NormalImage» сначала ищется в ресурсах кнопки (которые обычно пусты), затем в родительском контейнере, вплоть до ресурсов страницы / окна и далее до приложения. Ресурсы. Первое совпадение выигрывает, поэтому в этом случае локально определенный стиль с именем «NormalImage», который ссылается на OverrideImage.png, выбирается перед ресурсом уровня окна / страницы / контейнера с тем же именем, которое ссылается на DefaultImage.png

Для дальнейшего уменьшения объема текста

Если все кнопки или большинство кнопок будут использовать этот стиль, тогда удалите x: Key = "MyButtonStyle" из определения стиля. Таким образом, WPF будет использовать стиль на всех кнопках в области видимости, без необходимости явно указывать стиль. Затем вы можете использовать style = "{x: null}", чтобы явно НЕ использовать стиль по умолчанию. Таким образом: -

<Window.Resources>
  <Style x:Key="NormalImage" TargetType="{x:Type Image}">
    <Setter Property="Source" Value="Images/DeafultImage.png"/>
  </Style>

  <Style TargetType="{x:Type Button}">
    <Setter Property="Template">
            ...
    </Setter>
  </Style>
</Window.Resources>

<Button >
  <Button.Resources>
    <Style x:Key="NormalImage" TargetType="{x:Type Image}">
      <Setter Property="Source" Value="Images/OverrideImage.png"/>
    </Style>
  </Button.Resources>
</Button>

<Button Style="{x:null}>Normal Button</Button>
0 голосов
/ 22 декабря 2008

Вы можете создать стиль в ResourceDictionary, а затем объединить этот словарь с ресурсами управления. Если вы даете стилю ключ, вы можете привязать любую кнопку к этому стилю.

Например:

<Style x:Key="imageButton" ControlType="{x:Type Button}">
    ...
</Style>

<Button Style="{DynamicResource imageButton}" />
...