2015-12-09 11 views
5

Mam ten stylZmień styl z kodu za

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

Teraz, jeśli chcę zmienić Setter Property Value z kodu za w jaki sposób mogę to zrobić?

W kodzie za chciałbym coś takiego:

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

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

muszę używać tylko ramową 4.

Dziękuję

Odpowiedz

2

Giangregorio objęła większość z powodów, dlaczego ten nie może zostać osiągnięty bezpośrednio. Jednakże, oto rozwiązanie:

Można użyć DynamicResource odwołań w stylu na Setters, wtedy, kiedy trzeba zmienić styl, ty prostu zaktualizować zasób, zamiast stylu. Prawdopodobnie miałoby to więcej sensu na przykładzie:

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

Tak. Ponieważ właściwości Foreground odwołują się do DynamicResource, gdy zasób ulegnie zmianie, zaktualizuje on Style. Wszystko, co musisz zrobić w kodzie, to zmienić wartość zasobu.

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

Resztą zajmie się DynamicResource.

+1

właśnie siedzi tam myślenia Wiedziałem WPF obsługiwane styl wiązania rzeczy. +1 –

+0

Dobry pomysł ;-) Dziękuję bardzo. – Alan392

0

Nie można zmienić swój styl po pierwszym użyciu , z MSDN:

Styl jest plombowany, gdy inny styl jest na nim oparty lub kiedy jest zastosowano po raz pierwszy.

W twoim przypadku najprawdopodobniej zdefiniuję inny styl w XAML i przełączę je w czasie wykonywania.

W przeciwnym razie, jeśli nie używał go jeszcze można zrobić coś takiego (za pomocą indeksu, aby szybko przykładowe)

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

To jest mój ostateczny kod.

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

kod za

 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

Powiązane problemy