2010-08-06 14 views
12

मैं ऑब्जेक्ट्स की सूची में लिस्ट व्यू को बाध्य कर रहा हूं;एक सिस्टम से जुड़ने के लिए एक्सएएमएल का उपयोग कर। ड्रॉइंग। एक सिस्टम में इमेज .इंडोज़। इमेज कंट्रोल

<ListView 
    ItemsSource="{ Binding Path=. }" 
    ItemTemplate="{DynamicResource EventTemplate}"> 

मैं किसी ऑब्जेक्ट पर बाध्यकारी हूं जो दो गुणों की घोषणा करता है;

string DisplayName { get; } 
System.Drawing.Image Image { get; set; } 

मैं एक DataTemplate को भरने के लिए चाहते हैं, लेकिन मैं कैसे समझ नहीं कर सकते हैं; अगर मैं इसे अपने टेम्पलेट में करता हूं;

<StackPanel Orientation="Horizontal"> 
    <Image Source="{ Binding Path=Image }" /> 
    <TextBlock Text="{ Binding Path=DisplayName }" /> 
</StackPanel>  

पाठ प्रकट होता है लेकिन छवि नहीं होती है। मैं क्या गलत कर रहा हूं? डिबग आउटपुट

System.Windows.Data Error: 1 : Cannot create default converter 
to perform 'one-way' conversions between types 
'System.Drawing.Image' and 'System.Windows.Media.ImageSource'. 
Consider using Converter property of Binding. 
BindingExpression:Path=Image; DataItem='RealElement' 
(HashCode=54308798); target element is 'Image' (Name=''); 
target property is 'Source' (type 'ImageSource') 

उत्तर

34

एक तरीका मिला जिस से मैं खुश हूं। Reed Copsey's pointer और this tutorial का उपयोग करके मैंने कोड को IValueConverter के रूप में लपेट लिया है।

यहां कनवर्टर System.Drawing.Image से System.Windows.Media.ImageSource तक कनवर्टर है;

using System; 
using System.Drawing.Imaging; 
using System.Globalization; 
using System.IO; 
using System.Windows.Data; 

namespace System.Windows.Media 
{ 
    /// <summary> 
    /// One-way converter from System.Drawing.Image to System.Windows.Media.ImageSource 
    /// </summary> 
    [ValueConversion(typeof(System.Drawing.Image), typeof(System.Windows.Media.ImageSource))] 
    public class ImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, 
      object parameter, CultureInfo culture) 
     { 
      // empty images are empty... 
      if (value == null) { return null; } 

      var image = (System.Drawing.Image)value; 
      // Winforms Image we want to get the WPF Image from... 
      var bitmap = new System.Windows.Media.Imaging.BitmapImage(); 
      bitmap.BeginInit(); 
      MemoryStream memoryStream = new MemoryStream(); 
      // Save to a memory stream... 
      image.Save(memoryStream, ImageFormat.Bmp); 
      // Rewind the stream... 
      memoryStream.Seek(0, System.IO.SeekOrigin.Begin); 
      bitmap.StreamSource = memoryStream; 
      bitmap.EndInit(); 
      return bitmap; 
     } 

     public object ConvertBack(object value, Type targetType, 
      object parameter, CultureInfo culture) 
     { 
      return null; 
     } 
    } 
} 

फिर आपको छवि कनवर्टर को संसाधन के रूप में एक्सएएमएल में लाने की आवश्यकता है;

xmlns:med="clr-namespace:System.Windows.Media" 
... 

<ListView.Resources> 
    <med:ImageConverter x:Key="imageConverter" /> 
</ListView.Resources> 

तो फिर तुम, छवि को सीधे बाध्य करने के लिए नई कनवर्टर का उपयोग कर XAML में इसका इस्तेमाल कर सकते हैं;

<Image Source="{ Binding Path=Image, Converter={StaticResource imageConverter} }" /> 
+1

मेरे पास मेमोरी उपयोग के बारे में कोई सवाल है: क्या यह रूपांतरण केवल एक बार या प्रत्येक बार छवि को i.e. ListBox के दृश्य भाग में दिखाया जाता है ?? – emesx

+1

वास्तव में नहीं कह सकता - रूपांतरण हर बार WPF द्वारा आवश्यक होता है - इसलिए मुझे लगता है कि यह केवल एक आंतरिक कार्यान्वयन विस्तार है। मुझे नहीं लगता कि इसे बदलने के लिए कोई कारण नहीं होगा, लेकिन यह काउंटर में चिपकने और देखने के लायक हो सकता है ... –

+1

'मेमोरीस्ट्रीम' कभी बंद या डिस्पोजेड नहीं है, क्या यह चिंता यहां है? मेरे पास कुछ बहुत ही समान कोड है, जो शायद इस प्रश्न से भी आ सकता है, लेकिन यह उलझन में है। – Maslow

4

से पता चलता आपको लगता है कि सीधे बाध्य नहीं कर सकते हैं - आप कनवर्टर के कुछ प्रकार है कि एक GDI छवि से एक WPF छवि में बदल जाएगा की आवश्यकता है।

यहां one approach है - यह जीडीआई छवि से डेटा खींचने और बिटमैप स्रोत ऑब्जेक्ट बनाने के लिए मेमोरी स्ट्रीम का उपयोग करता है।

+0

हाय - सूचक के लिए धन्यवाद। मैं आपके "बेहतर उपयोगकर्ता और डेवलपर अनुभव - विंडोज़ फॉर्म से एमवीवीएम के साथ डब्ल्यूपीएफ से इस समय लेख" पढ़ने के माध्यम से आधा रास्ता हूं; उत्तम सामग्री। वैसे भी, जिसने मुझे जवाब पाने के लिए पर्याप्त दिया; मैंने इसे साथ पोस्ट किया है। –

+0

@Steve: सुनने के लिए खुशी है कि आप श्रृंखला पसंद कर रहे हैं;) –

+0

यह वास्तव में सहायक रहा है। डब्ल्यूपीएफ मॉडल विंडोज रूपों से बहुत अलग है, और आपके निबंध मेरे दिमाग में इसे अनलॉक करने में मदद कर रहे हैं। –

संबंधित मुद्दे