2011-02-09 18 views
7

Chúng ta cần phải làm cho một số hình ảnh đồ họa vector thay đổi màu của các phần tử nhất định trong đồ họa khi chạy. Dường như việc thiết lập các màu đó dựa trên các giá trị tài nguyên tĩnh hoặc động sẽ không hoạt động. Chúng tôi muốn có nhiều phiên bản của cùng một đồ họa, mỗi phiên bản có lỗi để đặt một số yếu tố đồ họa (Path, Line, v.v.) thành các màu khác nhau nên tôi không nghĩ rằng phương pháp tiếp cận nguồn động sẽ hoạt động. Điều đó lá ràng buộc dữ liệu mà dường như là cách tiếp cận đúng. Chúng tôi cập nhật các đồ họa để sử dụng a expr ràng buộc dữ liệu thay vì một màu bàn chải cứng mã hóa như sau:Làm cách nào để bạn có thể tạo màu sắc của các yếu tố của hoạt động WPF DrawingImage?

<DrawingImage x:Key="Graphic1"> 
    <DrawingImage.Drawing> 
    <DrawingGroup> 
     <DrawingGroup.Children> 
     <GeometryDrawing Geometry="F1 M 8.4073,23.9233L"> 
      <GeometryDrawing.Pen> 
      <Pen LineJoin="Round" Brush="{Binding Line1Brush, Mode=OneWay}"/> 
      </GeometryDrawing.Pen> 
     </GeometryDrawing> 
     <GeometryDrawing Geometry="F1 M 3.6875,2.56251L"> 
      <GeometryDrawing.Pen> 
      <Pen LineJoin="Round" Brush="{Binding Line2Brush, Mode=OneWay}"/> 
      </GeometryDrawing.Pen> 
     </GeometryDrawing> 
     </DrawingGroup.Children> 
    </DrawingGroup> 
    </DrawingImage.Drawing> 
</DrawingImage> 

Sau đó, chúng tôi tạo ra một đối tượng xem mô hình (hỗ trợ INotifyPropertyChanged) dụ cho mỗi trường hợp của Graphic1 trong trường hợp này và làm cho chắc chắn nó có cả một số Line1Brush và thuộc tính Line2Brush. Nghe hay đấy, nhưng tôi không thể làm việc đó được. Tôi giả định đồ họa này, mà chính nó được định nghĩa trong một từ điển tài nguyên cho các đối tượng hình ảnh và tôi cố gắng để thiết lập của họ DataContext và tôi nhận được đầu ra lỗi ràng buộc dữ liệu trong cửa sổ gỡ lỗi của tôi. Đây là XAML hình ảnh:

<Image x:Name="Pulse1" Grid.Column="0" Source="{StaticResource Graphic1}"/> 
<Image x:Name="Pulse2" Grid.Column="1" Source="{StaticResource Graphic1}"/> 

Và sau đó trong phương pháp của Window Initialize tôi đặt bối cảnh dữ liệu của họ như sau:

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
    this.PulseImage1 = new PulseImageViewModel(); 
    this.PulseImage2 = new PulseImageViewModel(); 
    this.PulseImage2.Line1Brush = Brushes.Green; 
    this.PulseImage2.Line2Brush = Brushes.Red; 
    this.Pulse1.DataContext = this.PulseImage1; 
    this.Pulse2.DataContext = this.PulseImage2; 
} 

đâu PulseImageViewModel (hình dưới đây) định nghĩa hai thuộc tính Line1BrushLine2Brush, mỗi trong số đó kích hoạt sự kiện PropertyChanged.

public class PulseImageViewModel : INotifyPropertyChanged 
{ 
    private Brush _line1Brush = Brushes.Yellow; 
    private Brush _line2Brush = Brushes.Black; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public Brush Line1Brush 
    { 
     get { return _line1Brush; } 
     set 
     { 
      if (_line1Brush != value) 
      { 
       _line1Brush = value; 
       NotifyPropertyChanged("Line1Brush"); 
      } 
     } 
    } 
    public Brush Line2Brush 
    { 
     get { return _line2Brush; } 
     set 
     { 
      if (_line2Brush != value) 
      { 
       _line2Brush = value; 
       NotifyPropertyChanged("Line2Brush"); 
      } 
     } 
    } 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     var del = PropertyChanged; 
     if (del != null) 
     { 
      del(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Tuy nhiên, tôi nhận được dữ liệu ràng buộc lỗi chỉ ra rằng WPF đang tìm kiếm Line1Brush vào mức độ đầu MainWindow đối tượng thay vì trên đối tượng PulseImageViewModel tôi. Bất kỳ suy nghĩ về những gì tôi đang làm sai hoặc nếu có một cách tốt hơn để hoàn thành mục tiêu của tôi về màu sắc thay đổi động trên đồ họa vector? Ngoài ra, nó sẽ là tốt đẹp nếu đồ họa có thể mặc định cho một bộ màu đẹp, tĩnh nếu người dùng không treo lên đối tượng mô hình xem.

Trả lời

5

StaticResource sẽ có số DataContext từ số Window Tôi tin tưởng. Điều này có thay đổi nếu bạn sử dụng DynamicResource không?

Chỉnh sửa Tôi nhận được kết quả tương tự như bạn và Snoop không hữu ích. Ngay cả việc di chuyển DataContext sang XAML cũng không thay đổi gì cả. Đối với vui, tôi chuyển sang kéo một TextBox vào nội dung của Label, và lo and behold R worksNG hoạt động ... Không có ý tưởng sự khác biệt là gì.

<Window.Resources> 
    <TextBlock x:Key="Text1" 
       Text="{Binding Line1Brush}" /> 
</Window.Resources> 
<Grid> 
    <!-- Confusingly enough, this works --> 
    <Label Content="{StaticResource Text1}" 
      DataContext="{Binding PulseImage1}" /> 
</Grid> 

Chỉnh sửa 2 Các công trình sau đây:

<DataTemplate x:Key="Graphic1"> 
    <Image> 
     <Image.Source> 
      <DrawingImage> 
       <DrawingImage.Drawing> 
        <DrawingGroup> 
         <DrawingGroup.Children> 
          <GeometryDrawing Geometry="F1 M 8.4073,23.9233L"> 
           <GeometryDrawing.Pen> 
            <Pen LineJoin="Round" 
             Brush="{Binding Line1Brush, Mode=OneWay}" /> 
           </GeometryDrawing.Pen> 
          </GeometryDrawing> 
          <GeometryDrawing Geometry="F1 M 3.6875,2.56251L"> 
           <GeometryDrawing.Pen> 
            <Pen LineJoin="Round" 
             Brush="{Binding Line2Brush, Mode=OneWay}" /> 
           </GeometryDrawing.Pen> 
          </GeometryDrawing> 
         </DrawingGroup.Children> 
        </DrawingGroup> 
       </DrawingImage.Drawing> 
      </DrawingImage> 
     </Image.Source> 
    </Image> 
</DataTemplate> 

Với XAML trông như:

<ContentPresenter ContentTemplate="{StaticResource Graphic1}" 
        Content="{Binding PulseImage1}" 
        Grid.Column="0" /> 
<ContentPresenter ContentTemplate="{StaticResource Graphic1}" 
        Content="{Binding PulseImage2}" 
        Grid.Column="1" /> 
+0

Không, thay đổi để DynamicResource không giúp đỡ. Vẫn nhận được cùng một lỗi ràng buộc dữ liệu trong cửa sổ đầu ra - Lỗi đường dẫn BindingExpression: Thuộc tính 'Line1Brush' không tìm thấy trên 'đối tượng' '' MainWindow '(Tên =' ')'. –

+0

Hmm, tôi tự hỏi tại sao điều này yêu cầu DataTemplate/ContentPresenter hoạt động? Tôi đoán điều này sẽ hiệu quả đối với bất kỳ địa điểm nào yêu cầu hình ảnh, ví dụ: nút, mục menu, v.v ...? –

+0

Có, điều này sẽ hoạt động đối với bất kỳ người trong số họ. Vì bất kỳ lý do gì, các ràng buộc được đánh giá háo hức trong tài nguyên 'DrawingImage' trực tiếp. Nhưng trong một 'DataTemplate' chúng được đánh giá khi sử dụng. – user7116

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