2012-11-15 34 views
5

Trong XAML:Làm thế nào để thay đổi tài nguyên từ điển Màu sắc trong thời gian chạy

<ResourceDictionary> 
    <Color x:Key="BrushColor1">Red</Color> 
    <Color x:Key="BrushColor2">Black</Color> 

    <LinearGradientBrush x:Key="GradientBrush1" StartPoint="0,0.5" EndPoint="1,0.5"> 
     <GradientStop Color="{DynamicResource BrushColor2}" Offset="0" /> 
     <GradientStop Color="{DynamicResource BrushColor1}" Offset="1" /> 
    </LinearGradientBrush> 
</ResourceDictionary> 

Trong C#:

public void CreateTestRect() 
    { 
     Rectangle exampleRectangle = new Rectangle(); 
     exampleRectangle.Width = 150; 
     exampleRectangle.Height = 150; 
     exampleRectangle.StrokeThickness = 4; 
     exampleRectangle.Margin = new Thickness(350); 

     ResourceDictionary resources = this.Resources; 
     resources["BrushColor1"] = Colors.Pink; 
     resources["BrushColor2"] = Colors.RoyalBlue; 
     Brush brush =(Brush)this.FindResource("GradientBrush1"); 

     exampleRectangle.Fill = brush; 
     canvas.Children.Insert(0, exampleRectangle); 
    } 

Làm thế nào để thay đổi những yếu tố màu trong thời gian chạy trong C#. LinearGradientBrush sẽ được thay đổi động?

Tôi muốn làm một cái gì đó như thế này:

(Color)(this.FindResource("BrushColor1")) = Colors.Pink; 

nhưng tôi đã thất bại.

Trả lời

5

Bạn có thể ghi đè trực tiếp giá trị trong từ điển tài nguyên.

Ví dụ:

ResourceDictionary resources = this.Resources; // If in a Window/UserControl/etc 
resources["BrushColor1"] = System.Windows.Media.Colors.Black; 

Điều đó đang được nói, tôi sẽ thường khuyên không làm điều này. Thay vào đó, tôi sẽ có hai bộ màu sắc, mỗi bộ có khóa riêng của chúng và sử dụng một số cơ chế để chuyển đổi màu nào được gán cho các giá trị của bạn trong thời gian chạy thay thế. Điều này cho phép bạn để lại toàn bộ logic cho điều này trong chính xaml.

+0

Tôi đã thử, nhưng tôi vẫn không thể thay đổi màu trên canvas của mình. Dù sao, cảm ơn u. – dongx

+0

@XiaoruiDong Điều đó sẽ không hoạt động - bạn cần tìm từ điển tài nguyên thực tế để lưu trữ nó để thay đổi nó. –

+1

Tôi vừa giải quyết nó. Có vẻ như chỉ ** LinearGradientBrush ** không hỗ trợ ** DynamicResource **. Phần còn lại như ** SolidColorBrush ** hỗ trợ nó. – dongx

2

Tôi vừa giải quyết nó. Có vẻ như chỉ có LinearGradientBrush không hỗ trợ DynamicResource cho màu sắc. Ngay cả u cũng ghi đè màu động, bản thân số LinearGradientBrush sẽ không được cập nhật. PS: SolidColorBrush hỗ trợ thay đổi màu thời gian chạy. Làm điều gì đó bên dưới thay vì:

LinearGradientBrush linearGradientBrush = (LinearGradientBrush)(this.FindResource("GradientBrush1")); 
linearGradientBrush.GradientStops[0].Color = color1; 
linearGradientBrush.GradientStops[1].Color = color2; 

Nếu LinearGradientBrush được giấu trong một chiếc bàn chải phức tạp lồng nhau được định nghĩa trong từ điển tài nguyên, bạn thực hiện các LinearGradientBrush nổi lên, và gán một phím với nó.

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