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
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.
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ı. –
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? –
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