2010-09-29 44 views
14

Có cách nào để thay đổi (và áp dụng) kiểu động trong WPF không?Thay đổi kiểu động trong WPF

Nói rằng tôi có phong cách khai báo trong 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. Trong một khoảnh khắc, tôi cần phải thay đổi các Pink màu sắc, để, nói Green, và tất cả các dòng với phong cách MyLineStyleKey trở thành màu xanh lá cây . Một dòng là màu hồng khi được thả ra và màu xanh khi được chọn ... Bây giờ, tôi cần thay đổi thuộc tính chưa được chọn (Màu hồng thành Màu xanh lá cây) ..., vì vậy đây không chỉ là thiết lập màu khác, kích hoạt (lựa chọn> Màu xanh) sẽ không hoạt động nữa ... Có thể không? Làm sao?

  2. Có thể liên kết với màu hồng trong Kiểu, cho biết, với nền nút, phản ánh màu phong cách hiện được sử dụng không?

EDIT:
Đối tôi đã cố gắng:

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

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

nhưng một ngoại lệ xảy ra:

Sau một 'SetterBase' được sử dụng (đóng dấu), nó không thể sửa đổi.

+0

Điều đó có thể được thực hiện theo phương diện dYnamically. – Wernight

Trả lời

23

Tạo một bàn chải như một nguồn lực

<SolidColorBrush x:Key="MyFillBrush" Color="Pink" /> 

và tham khảo trong phong cách của bạn

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

Bây giờ hãy đến ge màu sắc của tất cả các hình dạng mà sử dụng "MyShapeStyle" phong cách, bạn có thể làm như sau từ bạn code-behind:

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

Điều đó làm cho công việc này là một thực tế rằng bạn sử dụng một DynamicResource cho tài liệu tham khảo bàn chải theo phong cách của bạn - điều này bảo WPF giám sát tài nguyên đó để thay đổi. Thay vào đó, nếu bạn sử dụng StaticResource, bạn sẽ không nhận được hành vi này.

+0

Câu hỏi: Tôi có thể vượt qua dynamicBrush không cho một userFrol WPF? – serhio

+0

Tôi không biết ý bạn là gì với "Pass" nhưng bạn chắc chắn có thể tham khảo nó từ điều khiển người dùng của bạn ngay cả khi nó được định nghĩa trên một điều khiển cao hơn trong hệ thống phân cấp (như trên cửa sổ). –

+0

Giải pháp này có thể giải quyết được vấn đề, nhưng nó không trả lời chính xác câu hỏi được hỏi – peter70

15

Chỉ có thể sửa đổi kiểu trước khi sử dụng lần đầu tiên. Từ MSDN:

Kiểu được niêm phong khi một kiểu khác dựa trên nó hoặc khi được áp dụng lần đầu tiên.

Thay vào đó, bạn có thể tạo một phong cách mới dựa trên phong cách hiện tại của bạn, và ghi đè các thuộc tính bạn muốn:

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 ... Tôi có một phong cách với một kích hoạt ... Một dòng là màu hồng khi phát hành, và màu xanh khi được chọn ... Bây giờ, tôi cần phải thay đổi tài sản không được chọn ..., vì vậy đây không chỉ là thiết lập nó một màu khác, kích hoạt (lựa chọn> Màu xanh) sẽ không hoạt động nữa ... – serhio

+0

cập nhật câu hỏi với các chi tiết .. – serhio

+0

hm ...Tôi cho rằng, nếu tôi sẽ tách tất cả các dòng khỏi phong cách, tôi sẽ không thể sửa đổi nó, một khi đã sử dụng ... – serhio

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