2012-04-27 15 views
7

Tôi muốn có thể đặt thuộc tính kiểu (và giá trị) từ tệp .cs trong cửa sổ WPF của tôi.Thay đổi kiểu XAML động trong Mã Đằng sau để các điều khiển áp dụng kiểu đó cũng phản ánh thay đổi

Vấn đề của tôi là nếu tôi có 30 hình chữ nhật, tất cả những gì tôi muốn có cùng một kiểu (và tôi không muốn cập nhật tất cả chúng riêng lẻ). Tôi muốn có tất cả các thiết lập (trong tập tin xaml) để cùng một phong cách, và sau đó cập nhật phong cách để tìm cách tôi muốn.

Giả sử tôi đặt Style = "key1" trong Xaml cho mỗi hình chữ nhật. Sau đó, tôi muốn có thể sửa đổi "key1" sau đó để tất cả các hình chữ nhật sẽ phản ánh thay đổi đó.

tôi đã cố gắng trong App.xaml

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

Trong MainwWindows.xaml

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

Trong mã đằng sau

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)); 
} 

này cập nhật phong cách nhưng không cập nhật các hình chữ nhật.

Điều này có khả thi không? Có ai biết cách để làm điều này không? (Một ví dụ sẽ được đánh giá cao).

+0

Tôi nghĩ rằng bạn phải gọi phương thức 'Update()' hoặc 'Refresh()' trên các phần tử giao diện người dùng (chỉ toàn bộ Cửa sổ hoặc Hình chữ nhật). hãy thử nó, có thể điều này có thể hữu ích. – stukselbax

Trả lời

10

Bạn cần sử dụng DynamicResource để có thể thay đổi thời gian chạy. Bạn cũng cần phải thay thế kiểu mới, không cố sửa đổi kiểu hiện có. Công trình này hoạt động:

<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

Điều đáng nói là các kiểu được niêm phong khi được sử dụng và do đó không thể thay đổi. Đây là lý do tại sao các kiểu nên được thay thế bằng một cá thể khác thay vì được cập nhật.

Các vấn đề liên quan