2015-12-09 2 views
5

У меня есть этот стильИзменить стиль из кода за

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<Style x:Key="MainMenuStyle" TargetType="{x:Type TextBlock}"> 

    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property= "Foreground" Value="White"/> 
      <Setter Property= "FontSize" Value="22"/> 
      <Setter Property= "FontFamily" Value="Arial"/> 
     </Trigger> 

     <Trigger Property="IsMouseOver" Value="False"> 
      <Setter Property= "Foreground" Value="Black" /> 
      <Setter Property= "FontSize" Value="14"/> 
      <Setter Property= "FontFamily" Value="Verdana"/> 
     </Trigger> 

    </Style.Triggers> 

</Style> 

Теперь, если я хочу изменить Setter Property Value из кода за тем, как я могу это сделать?

В коде позади я хочу что-то вроде этого:

MainMenuStyle.IsMouseOver(True).Foreground = "Red" 
MainMenuStyle.IsMouseOver(True).FontSize = 10 

MainMenuStyle.IsMouseOver(False).Foreground = "Green" 
MainMenuStyle.IsMouseOver(False).FontSize = 100 

Я должен использовать только рамочное 4.

Спасибо

ответ

2

Giangregorio охватывает большую часть причин, почему это не может быть достигнуто напрямую. Однако, вот решение:

Вы можете использовать DynamicResource ссылки в ваш стиль Setters-х, тогда, когда вам нужно изменить стиль, вы просто обновить ресурс, вместо стиля. Это, вероятно, имеет больше смысла с примером:

<!-- Colour Resources --> 
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/> 
<SolidColorBrush x:Key="RedBrush" Color="Red"/> 

<!-- TextBlock Style (References the colour resources) --> 
<Style x:Key="MainMenuStyle" TargetType="{x:Type TextBlock}"> 

    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property= "Foreground" Value="{DynamicResource BlueBrush}"/> 
      ... 
     </Trigger> 
     <Trigger Property="IsMouseOver" Value="False"> 
      <Setter Property= "Foreground" Value="{DynamicResource RedBrush}" /> 
      ... 
     </Trigger> 
    </Style.Triggers> 

</Style> 

So. Поскольку свойства Foreground ссылаются на DynamicResource, всякий раз, когда ресурс изменяется, он обновляет Style. Все, что вам нужно сделать в коде, это изменение значения ресурса.

App.Current.Resources["BlueBrush"] = new SolidColorBrush(Colors.Pink); 

DynamicResource позаботится об остальном.

+1

Я просто сидел там думая, что я знал, что МОФ поддерживается стиль связывания материала. +1 –

+0

Хорошая идея ;-) Большое спасибо. – Alan392

0

Вы не можете изменить свой стиль после его первого использования , от MSDN:

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

В вашем случае я, вероятно, определю другой стиль в XAML и переключу их во время выполнения.

В противном случае, если вы не использовали его, то вы можете сделать что-то вроде этого (используя индекс, чтобы сделать быстрый пример)

Style style = this.Resources["MainMenuStyle"] as Style; 
    ((Trigger)style.Triggers[0]).Setters[0] = new Setter(TextBlock.ForegroundProperty, new SolidColorBrush(Colors.Green)); 
    yourControl.Style = style; 
0

Это мой последний код.

<!-- Colour Resources --> 
<!-- Default values --> 

<SolidColorBrush x:Key="MenuItem_Select_Color" Color="Blue"/> 
<FontFamily x:Key="MenuItem_Select_Font">Calibri</FontFamily> 
<sys:Double x:Key="MenuItem_Select_Font_Size">13</sys:Double> 

<SolidColorBrush x:Key="MenuItem_UnSelect_Color" Color="Green"/> 
<FontFamily x:Key="MenuItem_UnSelect_Font">Arial Black</FontFamily> 
<sys:Double x:Key="MenuItem_UnSelect_Font_Size">12</sys:Double> 



<!-- TextBlock Style (References the colour resources) --> 
<Style x:Key="MainMenuStyle" TargetType="{x:Type TextBlock}"> 

    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property= "Foreground" Value="{DynamicResource MenuItem_Select_Color}"/> 
      <Setter Property= "FontFamily" Value="{DynamicResource MenuItem_Select_Font}"/> 
      <Setter Property= "FontSize" Value="{DynamicResource MenuItem_Select_Font_Size}"/> 
     </Trigger> 

     <Trigger Property="IsMouseOver" Value="False"> 
      <Setter Property= "Foreground" Value="{DynamicResource MenuItem_UnSelect_Color}"/> 
      <Setter Property= "FontFamily" Value="{DynamicResource MenuItem_UnSelect_Font}"/> 
      <Setter Property= "FontSize" Value="{DynamicResource MenuItem_UnSelect_Font_Size}"/>     
     </Trigger> 

    </Style.Triggers> 

</Style> 

код за

 Application.Current.Resources("MenuItem_Select_Color") = New SolidColorBrush(Colors.DarkBlue) 
     Application.Current.Resources("MenuItem_UnSelect_Color") = New SolidColorBrush(Colors.Gold) 

     Application.Current.Resources("MenuItem_Select_Font") = New FontFamily("Broadway") 
     Application.Current.Resources("MenuItem_UnSelect_Font") = New FontFamily("Lucida Console") 

     Application.Current.Resources("MenuItem_Select_Font_Size") = 20 
     Application.Current.Resources("MenuItem_UnSelect_Font_Size") = 30 

Bye

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