Динамическое изменение стиля в WPF - PullRequest
19 голосов
/ 29 сентября 2010

Есть ли способ динамического изменения (и применения) стиля в WPF?

Скажем, у меня объявлен стиль в XAML:

    <Style TargetType="local:MyLine" 
           x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
        <Setter Property="Fill" Value="Pink"/>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="true">
                <Setter Property="Fill" Value="Blue" />                    
            </Trigger>
        </Style.Triggers>
    </Style>
  1. Вна мгновение мне нужно изменить Pink цвет, скажем Green, и все линии со стилем MyLineStyleKey станут зелеными.Линия имеет розовый цвет при отпускании и синий при выделении ... Теперь мне нужно было изменить невыбранное свойство (с розового на зеленый) ..., так что это не просто установка другого цвета, а триггер (выбор> синий)) больше не будет работать ... Это возможно?Как?

  2. Возможно ли привязать к розовому цвету в стиле, скажем, к фону кнопки, который будет отражать используемый в данный момент цвет стиля?

РЕДАКТИРОВАТЬ:
Для 1 Я пытался:

Style s = (Style)this.Resources["MyLineStyleKey"];

(s.Setters[0] as Setter).Value = background;
(s.Setters[1] as Setter).Value = background;

, но произошло исключение:

После использования SetterBase (запечатанного) его нельзя изменить.

Ответы [ 2 ]

24 голосов
/ 29 сентября 2010

Создайте кисть в качестве ресурса

<SolidColorBrush x:Key="MyFillBrush" Color="Pink" />

и обратитесь к ней в своем стиле

<Style x:Key="MyShapeStyle" TargetType="Shape">
    <Setter Property="Fill" Value="{DynamicResource MyFillBrush}" />
</Style>
...
<!-- Then further down you may use it like this -->
<StackPanel Width="100">
    <Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
    <Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
    <Ellipse Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
    <Button Content="Click to change color" Click="Button_Click" Margin="8" />
</StackPanel>

Теперь, чтобы изменить цвет всех фигур, которые используют стиль "MyShapeStyle",Вы можете сделать следующее из своего кода:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Random r = new Random();
    this.Resources["MyFillBrush"] = new SolidColorBrush(Color.FromArgb(
          0xFF, 
          (byte)r.Next(255), 
          (byte)r.Next(255), 
          (byte)r.Next(255)));
}

То, что делает эту работу, заключается в том, что вы используете DynamicResource для ссылки на кисть в своем стиле - это говорит WPF контролировать эторесурс для изменений.Если вместо этого вы используете StaticResource, вы не получите такого поведения.

19 голосов
/ 29 сентября 2010

Стиль можно изменить только перед его первым использованием. Из MSDN:

Стиль запечатывается, когда другой стиль основан на нем или когда он применяется впервые.

Вместо этого вы можете создать новый стиль на основе существующего стиля и переопределить нужные свойства:

Style newStyle = new Style();
newStyle.BasedOn = originalStyle;
newStyle.TargetType = typeof(MyLine);
Brush blue = new SolidColorBrush(Colors.Blue);
newStyle.Setters.Add(new Setter(Shape.FillProperty, blue));
newStyle.Setters.Add(new Setter(Shape.StrokeProperty, blue));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...