2013-02-21 19 views
7

मेरे पास एक WPF एप्लिकेशन है जिसे उपयोगकर्ता को आंतरिक स्थिति के बारे में प्रतिक्रिया प्रदान करने की आवश्यकता है। डिजाइन में तीन छवियां हैं, उन्हें लाल, पीला, और हरा कहें। इन छवियों में से एक राज्य के आधार पर एक समय में प्रदर्शित किया जाएगा। यहाँ बिंदु हैं:मैं गुणों में एक छवि के साथ WPF में कोड-बैक से गतिशील रूप से एक छवि स्रोत कैसे बदलूं? स्रोत?

  • तीन छवियों कोड-पीछे
  • छवियों का केवल एक में Properties.Resources में हैं एक समय में दिखाया जाएगा।
  • राज्य परिवर्तन कोड-पीछे की प्रक्रिया से आता है और उपयोगकर्ता से नहीं।
  • मैं एक छवि नियंत्रण बांधना चाहता हूं ताकि मैं छवि को कोड-पीछे से बदल सकूं।

मैं यह सोचते हैं रहा हूँ मैं एक छवि कनवर्टर की आवश्यकता होगी इस तरह के रूप में एक छवि स्रोत के लिए JPG छवि को बदलने के लिए:


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

मैं छवियों कन्वर्ट करने के लिए पसंद करते हैं एक बार प्रारंभिकरण के दौरान और छवि स्रोतों की एक सूची रखें। मैं भी यह सोचते हैं रहा हूँ मैं करने के लिए बाध्य करने के लिए नियंत्रण निर्भरता संपत्ति की आवश्यकता होगी, लेकिन मैं उस छवि के सूत्रों की इस सूची के साथ सेट करने का तरीका यकीन नहीं है:


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

उत्तर

31

हालांकि एक छवि संसाधन एक WPF प्रोजेक्ट में प्रॉपर्टी Resources.Designer.cs में उत्पन्न करती है, तो आप सीधे उस संसाधन से BitmapImage बना सकते हैं। आपको केवल छवि फ़ाइल के Build Action को Resource (डिफ़ॉल्ट None के बजाय) सेट करने की आवश्यकता है।

यदि आपके पास Red.jpg है Resources आपके विजुअल स्टूडियो प्रोजेक्ट के फ़ोल्डर में, BitmapImage बनाना नीचे दिखाए गए जैसा दिखता है। यह WPF Pack Uri का उपयोग करता है।

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

आप एक Image नियंत्रण इस तरह XAML में कहीं घोषित हों:

<Image x:Name="image"/> 

आप बस छवि के Source संपत्ति अपने BitmapImage करने के लिए कोड में पीछे सेट कर सकते हैं:

image.Source = bitmap; 

यदि आपसेट करना पसंद करते हैंबाध्यकारी द्वारा संपत्ति आप string संपत्ति बना सकते हैं जो छवि यूआरआई लौटाती है। स्ट्रिंग को स्वचालित रूप से WP12 में अंतर्निहित TypeConverter द्वारा BitmapImage में परिवर्तित कर दिया जाएगा।

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 में आप इस तरह है कि संपत्ति के लिए बाध्य होगा:

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

बेशक आप के रूप में अच्छी संपत्ति की घोषणा कर सकता है प्रकार की होनी चाहिए 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); } 
} 

और उसी तरह बांधें:

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

अब आप अपने चित्रों को पहले से लोड कर सकते हैं और आवश्यकता के अनुसार उन्हें संपत्ति में डाल दिया:

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; 

अद्यतन: सब के बाद, अपनी छवियों दृश्य स्टूडियो परियोजना में संसाधनों होने की जरूरत नहीं है। आप बस एक प्रोजेक्ट फ़ोल्डर जोड़ सकते हैं, छवि फ़ाइलों को उस फ़ोल्डर में डाल सकते हैं और अपनी बिल्ड एक्शन को Resource पर सेट कर सकते हैं। उदाहरण के लिए यदि आप फ़ोल्डर Images कहते हैं, तो यूआरआई pack://application:,,,/Images/Red.jpg होगा।

+0

क्लेमेंस आप रॉक! यह एक शानदार, व्यापक, समझने में आसान प्रतिक्रिया थी। मैं बाध्यकारी विकल्प का उपयोग करने के लिए प्रेरित हूं, लेकिन मेरे मामले में कोड-बैक में स्रोत को सेट करने का पहला विकल्प बहुत ही सुरुचिपूर्ण है। एकमात्र समस्या यह है कि मैं इसे पीएनजी फाइलों के साथ काम नहीं कर सका। मैं एक पारदर्शी पृष्ठभूमि की उम्मीद कर रहा था। क्या यह पीएनजी फाइलों के साथ काम करना चाहिए? क्या मैं बस कुछ गलत कर रहा हूं, या वे समर्थित नहीं हैं? – dtaylor

+0

यह पीएनजी फ़ाइलों के साथ भी काम करना चाहिए। शायद आपको उन्हें अपने प्रोजेक्ट में संसाधन के रूप में नहीं जोड़ना चाहिए (मेरा संपादन देखें)। बस अपनी पसंदीदा छवि उपकरण के साथ फाइलें बनाएं और उन्हें अपनी परियोजना में किसी फ़ोल्डर में जोड़ें। स्वीकार करने के बारे में [यहां] (http://meta.stackexchange.com/a/5235) देखें। – Clemens

+0

क्लेमेंस, फिर से आपने एक स्पष्ट और संक्षिप्त उत्तर प्रदान किया है! पीएनजी फ़ाइल बहुत बढ़िया काम करती है जब मैं इसे एक फ़ोल्डर में डाल रहा हूं और संसाधनों के रूप में इसे संसाधन के रूप में जोड़ने के बजाय संसाधन के रूप में बना रहा हूं। संसाधन डिजाइनर में संसाधन। बहुत - बहुत धन्यवाद। – dtaylor