2011-02-09 18 views
7

Belirli vektör grafik görüntülerinin, çalışma zamanında grafikteki belirli öğelerin rengini değiştirmesini sağlamaya ihtiyacımız var. Bu renkleri statik veya dinamik kaynak değerlerine göre ayarlamak işe yaramaz. Aynı grafiğin birden çok versiyonuna sahip olmak istiyoruz, her biri farklı grafik elemanlarını (Yol, Çizgi, vb.) Farklı renklere ayarlayabilme kabiliyeti ile dinamik bir kaynak yaklaşımının işe yaramayacağını düşünmüyorum. Bu doğru yaklaşım gibi görünüyor veri bağlama bırakır. Bu durumdaBir WPF DrawingImage dinamik öğesinin renklerini nasıl oluşturabilirsiniz?

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

Sonra bir görünüşüdür modeli nesne oluşturmak Graphic1 her bir örneği için (destek INotifyPropertyChanged) örneği ve yapmak, böylece: gibi kodlanmış bir fırça renk yerine veri bağlama expr kullanımı grafik güncelleme hem Line1Brush hem de Line2Brush özelliğine sahip olduğundan emin olun. Kulağa hoş geliyor ama işe yaramayacağım. Bir kaynak sözlüğünde kendisini Image nesnelerine tanımlayan bu grafiği kabul ediyorum ve onların DataContext ayarlarını yapmaya çalışıyorum ve Debug penceremde veri bağlama hatası çıktısı alıyorum.

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

Sonra Pencere Initialize yöntem I gibi pek kendi veri içeriği ayarlanır: Burada Resim XAML var

(aşağıda gösterilmiştir) PulseImageViewModel iki özelliği Line1Brush ve Line2Brush tanımlar
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; 
} 

, her biri PropertyChanged olayını tetikler.

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

Yine de veri WPF nesne yerine benim PulseImageViewModel nesne üzerinde MainWindow üst düzeyde Line1Brush aradığı belirten hataları bağlayıcı olsun. Ne yaptığım hakkında yanlış düşünceler var mı, yoksa vektör grafikleri üzerinde dinamik olarak değişebilen renkler hedefimi gerçekleştirmenin daha iyi bir yolu var mı? Ayrıca, eğer kullanıcı görünüm modeli nesnesini bağlamadıysa, grafikler güzel ve statik bir renk kümesine varsayılan olarak kullanılabilir.

cevap

5

StaticResource, Window inanıyorum. DynamicResource'u kullanırsanız bu değişir mi?

Edit Sizinle aynı sonuçları alıyorum ve Snoop yardımcı olmuyor. DataContext'i XAML'ye taşımak bile hiçbir şeyi değiştirmez. Eğlenmek için bir TextBox'ı bir Label'in içeriğine çekmeye başladım ve işte bu işe yaradım. Farkın ne olduğu hakkında bir fikir yok.

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

Düzenleme 2 aşağıdaki çalışır: XAML gibi bakarken

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

:

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

Hayır, DynamicResource değişen yardımcı olmadı. Hala çıkış penceresinde aynı veri bağlama hatası olsun - BindingExpression yolu hatası: 'Line1Brush' özelliği 'object' '' MainWindow '(Name =' ')' üzerinde bulunamadı. –

+0

Hmm, Neden bunun bir DataTemplate/ContentPresenter çalışmasını gerektirdiğini merak ediyorum? Bu, örneğin bir görüntü gerektiren herhangi bir yer için çalışır. düğme, menü öğesi, vb? –

+0

Evet, bu herhangi biri için işe yarayacaktı. Hangi sebepten dolayı bağlamalar doğrudan 'DrawingImage' kaynağında hevesle değerlendirilir. Ancak bir DataTemplate'de kullanımda değerlendiriliyorlar. – user7116

İlgili konular