2010-09-29 2 views
14

Есть ли способ изменить (и применить) стиль динамически в WPF?Динамически изменять стиль в 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 стали Green , Линия розовая, когда ее отпускают, а синий - когда выбрано ... Теперь мне нужно было изменить невыбранное свойство (от Pink до Green) ..., так что это не просто настройка его на другой цвет, триггер (выбор> синий) больше не будет работать ... Это возможно? Как?

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

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

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

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

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

После 'SetterBase' находится в использовании (запечатаны), его не могут быть изменены.

+0

Это может быть сделано DYamamically. – Wernight

ответ

23

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

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

Теперь, чтобы chan GE цвет всех форм, которые используют «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, вы не получите этого поведения.

+0

Вопрос: Могу ли я передать динамический пакет в пользовательский контроль WPF? – serhio

+0

Я не знаю, что вы имеете в виду с «Pass», но вы можете с уверенностью ссылаться на него с вашего пользовательского элемента управления, даже если он определен на элементе управления выше в иерархии (например, в окне). –

+0

Это решение может решить проблему, но оно не отвечает точно заданному вопросу – peter70

15

Стиль может быть изменен только до его первого использования. От 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)); 
+0

oh ... У меня есть стиль с триггером ... Линия была розовой, когда она была выпущена, а Синий при выборе ... Теперь мне нужно было изменить невыбранное свойство ..., так что это не просто установка другой цвет, триггер (выбор> синий) больше не будет работать ... – serhio

+0

обновил вопрос с подробностями .. – serhio

+0

hm ...Я полагаю, что если я отсоединю все строки из стиля, я не смогу его модифицировать, как только он будет использован ... – serhio

Смежные вопросы