2013-02-21 17 views
7

Kullanıcıya dahili bir durum hakkında geri bildirim sağlaması gereken bir WPF uygulamasına sahibim. Tasarım üç görüntüye sahip olmak, onları Kırmızı, Sarı ve Yeşil olarak adlandırmaktır. Bu görüntülerden biri, duruma bağlı olarak bir seferde görüntülenecektir. İşte noktalar şunlardır:Bir görüntü kaynağını, WPF'deki kod arkasından, Özellikler'deki bir görüntü ile dinamik olarak nasıl değiştiririm?

  • üç görüntüleri bir anda gösterilecek görüntülerin kod arkasında
  • Sadece birinde Properties.Resources içindedir.
  • Durum değişikliği, kullanıcı tarafından değil, kod arkasındaki bir işlemden gelir.
  • Görüntü kontrolünü bağlamak istiyorum, böylece görüntüyü arkadan değiştirebiliyorum.
ben gibi bir görüntü kaynağına JPG imajını değiştirmek için bir görüntü dönüştürücü gerekir sanıyorum

:


[ValueConversion(typeof(System.Drawing.Bitmap), typeof(ImageSource))] 
public class BitmapToImageSourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var bmp = value as System.Drawing.Bitmap; 
     if (bmp == null) 
      return null; 
     return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
        bmp.GetHbitmap(), 
        IntPtr.Zero, 
        Int32Rect.Empty, 
        BitmapSizeOptions.FromEmptyOptions()); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Ben görüntüleri dönüştürmek için tercih ediyorum Başlatma sırasında bir kez ve Görüntü kaynaklarının bir listesini tutun. Ben de kontrolü bağlamak bir bağımlılık özelliği gerekir sanıyorum ama görüntü kaynaklarının bu liste ile o nasıl kurulacağı emin değilim:


// Dependancy Property for the North Image 
    public static readonly DependencyProperty NorthImagePathProperty 
     = DependencyProperty.Register(
      "NorthImagePath", 
      typeof(ImageSource), 
      typeof(MainWindow), 
      new PropertyMetadata("**Don't know what goes here!!!**")); 

    // Property wrapper for the dependancy property 
    public ImageSource NorthImagePath 
    { 
     get { return (ImageSource)GetValue(NorthImagePathProperty); } 
     set { SetValue(NorthImagePathProperty, value); } 
    } 

cevap

31

bir görüntü kaynağı olmasına rağmen Bir WPF projesinde, Resources.Designer.cs içinde bir System.Drawing.Bitmap özelliği oluşturur, bu kaynaktan doğrudan bir BitmapImage oluşturabilirsiniz. Görüntü dosyasının Build Action değerini yalnızca Resource (varsayılan None yerine) olarak ayarlamanız gerekir.

Visual Studio projenizin klasöründe Red.jpg dosya varsa, BitmapImage oluşturmak aşağıdaki gibi görünecektir. WPF Pack Uri kullanır.

var uri = new Uri("pack://application:,,,/Resources/Red.jpg"); 
var bitmap = new BitmapImage(uri); 

böyle XAML yerde ilan bir Image denetimi varsa:

<Image x:Name="image"/> 

sadece kodda sizin BitmapImage resmin Source özelliğini ayarlayabilirsiniz:

image.Source = bitmap; 

'yi ayarlamayı tercih edersenizözelliğini bağlayarak, görüntü URI'sini döndüren string özelliği oluşturabilirsiniz. Dize, WPF'de yerleşik bir TypeConverter tarafından otomatik olarak BitmapImage'a dönüştürülecektir.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     ImageUri = "pack://application:,,,/Resources/Red.jpg"; 
    } 

    public static readonly DependencyProperty ImageUriProperty = 
     DependencyProperty.Register("ImageUri", typeof(string), typeof(MainWindow)); 

    public string ImageUri 
    { 
     get { return (string)GetValue(ImageUriProperty); } 
     set { SetValue(ImageUriProperty, value); } 
    } 
} 

XAML içinde böyle o mülke bağlamak istiyorum: siz de mal beyanında olabilir Tabii

<Image Source="{Binding ImageUri}"/> 

türde olması ImageSource

public static readonly DependencyProperty ImageProperty = 
    DependencyProperty.Register("Image", typeof(ImageSource), typeof(MainWindow)); 

public ImageSource Image 
{ 
    get { return (ImageSource)GetValue(ImageProperty); } 
    set { SetValue(ImageProperty, value); } 
} 

ve aynı şekilde bağla:

<Image Source="{Binding Image}"/> 

Artık görüntüleri önceden yüklemek ve gerektiğinde mülkiyet içine sokabilirsin:

private ImageSource imageRed = 
    new BitmapImage(new Uri("pack://application:,,,/Resources/Red.jpg")); 
private ImageSource imageBlue = 
    new BitmapImage(new Uri("pack://application:,,,/Resources/Blue.jpg")); 
... 
Image = imageBlue; 

GÜNCELLEME: Her şeyden önce, resimlerinizin Visual Studio projesinde kaynakları olmak gerekmez. Bir proje klasörü ekleyebilir, görüntü dosyalarını bu klasöre ekleyebilir ve Oluştur eylemlerini Resource olarak ayarlayabilirsiniz. Örneğin, Images klasörünü çağırırsanız, URI pack://application:,,,/Images/Red.jpg olur.

+0

Clemens Siz sallanıyorsunuz! Bu fantastik, kapsamlı, anlaşılması kolay bir cevaptı. Bağlama seçeneğini kullanmak için cazip gelmekteyim, fakat benim durumumda, kaynağın kodunu arkasına yerleştirmenin ilk seçeneği sadece çok şık. Tek sorun, png dosyaları ile çalışmak için alamadım. Saydam bir arka plan için umut ediyordum. Png dosyaları ile çalışmalı mı? Yanlış bir şey mi yapıyorum yoksa desteklenmiyor mu? – dtaylor

+0

Bu, PNG dosyalarıyla da çalışmalıdır. Belki de bunları projenize kaynak olarak eklememelisiniz (düzenlememe bakın). Dosyaları favori görüntü aracınızla oluşturun ve bunları projenizdeki bir klasöre ekleyin. Kabul hakkında [bakın] (http://meta.stackexchange.com/a/5235) bakın. – Clemens

+0

Clemens, Yine net ve özlü bir cevap verdiniz! PNG dosyası, bir klasöre koyduğumda ve bunu Kaynak Tasarımcısı'nda bir properties.resource olarak eklemek yerine bir kaynak olarak oluşturduğumda harika çalışır. Bir milyona teşekkürler. – dtaylor

İlgili konular