2009-07-10 17 views
15

के रूप में एक एक्सएएमएल फ़ाइल का उपयोग करना, मैं एक छवि नियंत्रण के स्रोत के रूप में एक्सएएमएल में अधिमानतः परिभाषित वेक्टर ग्राफिक्स का उपयोग करने में सक्षम होना चाहता हूं, जैसे कि मैं वर्तमान में एक पीएनजी की तरह रास्टर छवि का उपयोग कर सकता हूं। इस तरह मैं आसानी से मिश्रण और बिटमैप और वेक्टर छवियों के बीच से मेल खाते हैं, इस तरह हो सकता है:वेक्टर छवि स्रोत

<StackPanel> 
    <Image Source="Images/Namespace.png"/> 
    <Image Source="Images/Module.xaml"/> 
</StackPanel> 

Module.xaml सबसे अधिक संभावना के बजाय अपने मूल तत्व <UserControl> रूप <DrawingImage> होगा।

वास्तव में, क्या मैं वास्तव में के लिए जा रहा हूँ, यह है तो मेरे ViewModel अपने विवेक से या तो एक रेखापुंज या सदिश छवि का चयन कर सकते हैं:

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

यह संभव है? क्या छवि। किसी दिए गए यूआरआई से एक्सएएमएल कक्षा लोड कर सकते हैं? या यह केवल बिटमैप संसाधन लोड करने में सक्षम है?

+4

मुझे आश्चर्य है ... WPF/Silverlight में XAML छवि का उपयोग क्यों करना मुश्किल होगा, या मूल रूप से समर्थित नहीं है ... क्योंकि WPF/Silverlight XAML पर आधारित है! – Jacques

उत्तर

1

1) प्रोजेक्ट में DrawingImage.xaml जोड़ें और इसकी गुण 'BuildAction = Content' और 'हमेशा कॉपी करें' पर सेट करें। अन्यथा आप बाहर से एक्सएएमएल को गतिशील रूप से लोड कर सकते हैं क्योंकि जिस तर्क को मैं समझाऊंगा, वह ढीला-एक्सएमएल के लिए भी काम करेगा।

2) एक कनवर्टर UIElement के लिए XAML uri कन्वर्ट करने के लिए लिखें, आपके मामले में यह हमेशा DrawingImage

public class FileToUIElementConverter :IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     FileStream fileStream = new FileStream((string)parameter, FileMode.Open); 
     return XamlReader.Load(fileStream) as DrawingImage; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

3 हो जाएगा) XAML के रूप में नीचे

<Window.Resources> 
    <local:FileToUIElementConverter x:Key="uriToUIElementConverter"/> 
</Window.Resources> 
<Grid> 
    <Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/> 
</Grid> 
+0

मुझे नहीं लगता कि फ़ाइलस्ट्रीम एक संकलित संसाधन (पैक: // यूआरआई) से लोड हो सकता है, है ना? –

+0

मैंने उपरोक्त तरीके से कोशिश की और यह अच्छी तरह से काम किया। –

+0

एक कनवर्टर है जो यहां संसाधनों को संभालता है: http://stackoverflow.com/a/21588195/418362 – Artfunkel

8

आप बस संदर्भित कर सकते हैं लिखें स्टेटिक स्रोतों के रूप में आपके वेक्टर ग्राफिक्स:

<Image Source="{StaticResource MyImage}" /> 

संसाधनों को संसाधनों में संग्रहीत करें DrawImage के रूप में आयनरी।

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <DrawingImage x:Key="MyImage"> 
     <DrawingImage.Drawing> 
     <DrawingGroup> 
      <DrawingGroup.Children> 
       <GeometryDrawing Brush="Black" Geometry="M 333.393,... 100.327 Z "/> 
       <GeometryDrawing Brush="Black" Geometry="F1 M 202.309,... Z "/> 
         : 
      </DrawingGroup.Children> 
     </DrawingGroup> 
    </DrawingImage.Drawing> 
    </DrawingImage> 

</ResourceDictionary> 
+0

निश्चित रूप से। डाटाबेसिंग परिदृश्य के साथ मेरी मदद नहीं करता है, हालांकि (कम से कम सीधे नहीं)। –

1

एम्बेड XAML संसाधन प्रकार 'संसाधन' के साथ (DrawingImage): अभिव्यक्ति ब्लेंड आप इस सामग्री उत्पन्न कर सकते हैं। यह तब एक अलग फ़ाइल नहीं है और इसे आपके मूल उदाहरण के रूप में सीधे यूआरआई के माध्यम से संदर्भित किया जा सकता है - लेकिन यूआरआई गैर-तुच्छ है। आपको माइक्रोसॉफ्ट के "पैक" यूआरआई सिंटैक्स को समझना होगा और इसका इस्तेमाल करना होगा।

+0

यह दस्तावेज नहीं है, लेकिन "पैक" यूआरआई आंतरिक को स्मृति में तब तक लोड नहीं किया जाता है जब तक कि आप अपना पहला UIElement चालू नहीं करते। तो, इसे App.cs में उपयोग करने का प्रयास करने से पहले (आपके मेनविंडो.एक्सएएमएल को भी लोड किया गया है) काफी निराशाजनक है। इसके बजाय, इसे अपने MainWindow_Load हैंडलर में उपयोग करें। –

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