2012-04-27 52 views
7

我希望能夠從我的WPF窗口中的.cs文件設置樣式屬性(和值)。在Code Behind中動態更改XAML樣式,以便應用該樣式的控件也反映更改

我的問題是如果我有30個矩形,所有我想要有相同的樣式(我不想單獨更新所有)。我希望將它們都設置爲(在xaml文件中)相同的樣式,然後更新樣式以按照我喜歡的方式進行。

說我在每個矩形的Xaml中設置了Style = "key1"。然後,我希望能夠稍後修改「key1」,以便所有矩形都能反映這種變化。

App.xaml

<Application.Resources> 
    <Style x:Key="key1" TargetType="Rectangle"> 
     <Setter Property="Fill" Value="Red"/> 
    </Style> 
</Application.Resources> 

試圖在MainwWindows.xaml

<StackPanel> 
    <Rectangle Style="{StaticResource key1}" Height="200" Width="200" x:Name="rect1"/> 
    <Button Click="Button_Click" Content="Click"/> 
</StackPanel> 

在後面的代碼

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Style style = Application.Current.Resources["key1"] as Style; 
    style.Setters.Add(new Setter(Rectangle.VisibilityProperty, Visibility.Collapsed)); 
} 

這個更新的風格,但不更新矩形。

這可能嗎?有誰知道如何做到這一點? (一個例子將不勝感激)。

+0

我認爲你必須調用UI元素(整個窗口或矩形)上的Update()或Refresh()方法。試試看,可能會有所幫助。 – stukselbax 2012-04-27 05:50:33

回答

10

您需要使用DynamicResource,以便它可以在運行時更改。您還需要將替換爲的樣式,而不是嘗試修改現有樣式。這個作品:

<StackPanel> 
    <Rectangle Style="{DynamicResource key1}" Height="200" Width="200" x:Name="rect1"/> 
    <Button Click="Button_Click" Content="Click"/> 
</StackPanel> 

Style style = new Style {TargetType = typeof(Rectangle)}; 
style.Setters.Add(new Setter(Shape.FillProperty, Brushes.Red)); 
style.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed)); 

Application.Current.Resources["key1"] = style; 
2

它也值得一提的是,樣式一旦使用密封,因此不能改變。這就是樣式應該被另一個實例替換而不是更新的原因。