2009-03-03 11 views
7

से डब्ल्यूपीएफ एक्सएएमएल संसाधनों को एक्सेस करना मैं वर्तमान में एक ऐसे अनुप्रयोग का निर्माण कर रहा हूं जिसमें कई घटक शामिल हैं, जिनमें से प्रत्येक प्लगइन सिस्टम के लिए काम करने के लिए इसके आसपास एक छोटे सी # कोड के साथ अनिवार्य रूप से एक डब्ल्यूपीएफ उपयोगकर्ता नियंत्रण है (एमईएफ का उपयोग करके) ।गैर-डब्ल्यूपीएफ कोड

मेरी समस्या यह है कि प्रत्येक घटक में एक आइकन शामिल होना चाहिए और अच्छी तरह से प्रयोजनों के लिए मैंने परिभाषित किया है कि System.Windows.Media.Brush के रूप में मैं केवल डिजाइन से निर्यात किए गए DrawingBrush का उपयोग कर सकता हूं।

private Brush CachedIcon = null; 

public override Brush Icon 
{ 
    get 
    { 
     if (CachedIcon == null) 
     { 
      CachedIcon = (Brush)(new BlahControl().TryFindResource("Icon")); 
     } 
     return CachedIcon; 
    } 
} 

मुझे लगता है कि पढ़ने के लिए एक तरह से नहीं मिल सका: अब मैं से गैर WPF सी # XAML के उस टुकड़े जहां मैं वर्तमान में उपयोगकर्ता नियंत्रण instantiating और संसाधन के लिए यह पूछने का भयानक वैकल्पिक हल है का उपयोग करने की जरूरत है संसाधन (जो एक .xaml फ़ाइल है, और कस्टम नियंत्रण में ResourceDictionary में संदर्भित) "सामान्य" सी # कक्षा से। डब्ल्यूपीएफ से संबंधित कुछ भी अच्छी TryFindResource विधि है लेकिन अन्यथा ऐसा कैसे करें? मैं एक्सएएमएल फ़ाइल को अन-एम्बेडेड के आसपास झूठ बोलने वाले आइकन के साथ नहीं रखना चाहता हूं।

उत्तर

2

अपने XAML कोड में यकीन है कि आइकन संसाधन निर्माण विकल्प "संसाधन" करने के लिए सेट है, और फिर संसाधन का संदर्भ यह एक XAML स्थिर संसाधन बनाने के लिए अपने नेट 2.0 कोड में

<UserControl.Resources> 
    <BitmapImage x:Key="icon1" UriSource="Resources/Icon1.ico" /> 
</UserControl.Resources> 

तो फिर तुम "{} xamlName .g.resource" में संसाधन मिलेगा धारा

उदाहरण कोड है कि एक शब्दकोश में एक XAML dll से सभी चिह्न लोड करता है:

using System.IO; 
using System.Reflection; 
using System.Collections; 
using System.Resources; 

... 

var icons = new Dictionary<String, Bitmap>(); 
var externalBaml = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, "MyXaml.dll")); 
Stream resourceStream = externalBaml.GetManifestResourceStream(externalBaml.GetName().Name + ".g.resources"); 
using (ResourceReader resourceReader = new ResourceReader(resourceStream)) { 
    foreach (DictionaryEntry resourceEntry in resourceReader) { 
     if (resourceEntry.Key.ToString().ToUpper().EndsWith(".ICO")) { 
      icons.Add(resourceEntry.Key.ToString(), Image.FromStream(resourceEntry.Value as Stream) as Bitmap); 
     } 
    } 
} 
+0

काम करने लगता है, लेकिन वेयररी हैकिश दिखता है। स्वचालित रूप से जेनरेट किए गए संसाधनों के आंतरिक नामों पर निर्भर होने से मुझे बहुत सलाह नहीं मिलती है। – Joey

+0

एह? संसाधनों के पास स्ट्रिंग नाम हैं, इसके बारे में आप कुछ भी नहीं कर सकते हैं! तुम क्या ढूंढ रहे हो? – TFD

+0

मैं बस सोच रहा था कि ".gresresources" चीज़ कितनी भरोसेमंद साबित होगी। मैंने रेमंड चेन के ब्लॉग को काफी पढ़ा है कि मैं वास्तव में ऐसा कुछ भी नहीं करना चाहता जो टूट सकता है क्योंकि यह केवल कार्यान्वयन का एक आर्टिफैक्ट है, दस्तावेज व्यवहार नहीं। – Joey

0

आप स्ट्रीम के रूप में अपनी असेंबली से संसाधन पढ़ सकते हैं।

उदाहरण यहाँ कोड: http://www.wpftutorial.net/ReadWPFResourcesFromWinForms.html

+0

हम्म, यह अभी काम करने के लिए नहीं मिल सका, बाद में Agani की कोशिश करेंगे। लेकिन यह वास्तव में समस्या के एक समझदार समाधान के रूप में मुझे हड़ताल नहीं करता है, या तो। हालांकि, जाहिर है कि XAML फ़ाइलों को पृष्ठ के बजाए संसाधन क्रिया को सेट करते समय XAML के रूप में एम्बेड किया जाता है। इस तरह एक बेहतर विकल्प हो सकता है। मै कोशिश करुॅगा। – Joey

0

नियंत्रण में ऐप्लिकेशन स्तर पर के बजाय माउस को परिभाषित करें, या तो App.xaml या एक मास्टर संसाधन शब्दकोश XAML फाइल में। फिर आप उसी TryFindResource विधि का उपयोग कर सकते हैं, लेकिन नियंत्रण का उदाहरण बनाये बिना।

+0

चूंकि प्रोजेक्ट एक WPF एप्लिकेशन नहीं है लेकिन केवल उपयोगकर्ता नियंत्रण में कोई App.xaml नहीं है। और जहां मैं केवल संसाधन संसाधन होने पर TryFindResource को कॉल करता हूं? आइकन पहले से ही एक में रहता है। – Joey

1

मेरे सुझाव हैं:

  • आइकन कहां पाया जा सकता है इसके बारे में आपके नियंत्रण पर मेटाडेटा प्रदान करें। आप इसे अपने स्वयं के कस्टम विशेषता के साथ कर सकते हैं (नीचे उदाहरण 1 देखें)। यह मेटाडेटा आपको नियंत्रण का उदाहरण बनाये बिना आइकन लोड करने की अनुमति देगा।

  • चूंकि आप एमईएफ का उपयोग कर रहे हैं, तो आप उपरोक्त के रूप में प्राप्त करने के लिए अपने निर्यात में मेटाडेटा का उपयोग कर सकते हैं। विवरण here। नीचे उदाहरण 2 देखें।

  • Brush की बजाय अपने आइकन को ImageSource के रूप में देखें। आप अपने ImageSource को दिखाने के लिए WPF के Image नियंत्रण का उपयोग कर सकते हैं, या आप इसे ImageBrush से पेंट कर सकते हैं।

  • मेटाडेटा में निर्दिष्ट नाम के साथ संसाधन पढ़ने के लिए टीएफडी द्वारा प्रदान की गई तकनीक का उपयोग करें। दुर्भाग्यवश, डब्ल्यूपीएफ BamlReader जैसी कुछ भी प्रदान करने के लिए प्रतीत नहीं होता है, जो गैर-WPF संदर्भ से WPF संसाधन को लोड करने के लिए इसे अधिक क्लीनर बना देगा।

उदाहरण 1:

[Icon("MyIconResourceName")] 
public class BlahControl : Control 
{ 
    ... 
} 

उदाहरण 2:

[Export(typeof(IApplicationComponent))] 
[ExportMetadata("IconResource", "MyIconResourceName")] 
public class BlahControl : Control 
{ 
    ... 
}