2010-01-06 21 views
11

पर आधारित WPF संसाधन मौजूद है: // यूआरआई, यह बताने का सबसे अच्छा तरीका क्या है कि संकलित संसाधन (उदाहरण के लिए "संसाधन" की बिल्ड एक्शन के साथ संकलित एक पीएनजी छवि) वास्तव में मौजूद है यूआरआई? यह एक अपवाद फेंकता है तो संसाधन नहीं मिला है -पता लगाएं कि क्या यूआरआई

private static bool CanLoadResource(Uri uri) 
{ 
    try 
    { 
     Application.GetResourceStream(uri); 
     return true; 
    } 
    catch (IOException) 
    { 
     return false; 
    } 
} 

(ध्यान दें कि Application.GetResources प्रलेखन is wrong:

कुछ चारों ओर ठोकर के बाद, मैं इस कोड है, जो काम करता है लेकिन अनाड़ी है के साथ आया था , डॉक्स की तरह अशक्त लौटने के बजाय गलत तरीके से स्पष्ट करें।)(डॉक्स को सही किया गया है, नीचे टिप्पणी देखें)

मैं एक उम्मीद (गैर असाधारण) परिणाम का पता लगाने के लिए अपवाद को पकड़ने पसंद नहीं है। और इसके अलावा, मैं वास्तव में स्ट्रीम लोड नहीं करना चाहता, मैं सिर्फ यह जानना चाहता हूं कि यह मौजूद है या नहीं।

क्या ऐसा करने का कोई बेहतर तरीका है, शायद निम्न स्तर के संसाधन API के साथ - आदर्श रूप से स्ट्रीम को लोड किए बिना और अपवाद को पकड़ने के बिना आदर्श?

+0

उन्होंने डॉक्टर को अपडेट किया, यह कहता है कि संसाधन मिलने पर यह अपवाद फेंकता है। – Shimmy

+1

@Shimmy, अपडेट के लिए धन्यवाद - मैंने उस जानकारी को शामिल करने के लिए संपादित किया है। –

+0

@ जॉन व्हाइट: बीटीडब्लू, मुझे लगता है कि आपको [जेपीरसन की पोस्ट] चिह्नित करना चाहिए (http://stackoverflow.com/questions/2013481/detect-whether-wpf-resource-exists-based-on-uri/2549641#2549641) जवाब। – Shimmy

उत्तर

10

मुझे एक समाधान मिला है जिसका मैं उपयोग कर रहा हूं जो सीधे यूरी पैक के साथ काम नहीं करता है बल्कि इसके संसाधन संसाधन द्वारा संसाधन को देखता है। ऐसा कहा जा रहा है कि, यूआरआई के मूल भाग को तैयार करने के लिए असेंबली का उपयोग करने वाले यूरी के अंत तक संसाधन पथ पर ध्यान देकर एक पैक यूआरआई का समर्थन करने के लिए इस उदाहरण को आसानी से संशोधित किया जा सकता है।

public static bool ResourceExists(string resourcePath) 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 

    return ResourceExists(assembly, resourcePath); 
} 

public static bool ResourceExists(Assembly assembly, string resourcePath) 
{ 
    return GetResourcePaths(assembly) 
     .Contains(resourcePath.ToLowerInvariant()); 
} 

public static IEnumerable<object> GetResourcePaths(Assembly assembly) 
{ 
    var culture = System.Threading.Thread.CurrentThread.CurrentCulture; 
    var resourceName = assembly.GetName().Name + ".g"; 
    var resourceManager = new ResourceManager(resourceName, assembly); 

    try 
    { 
     var resourceSet = resourceManager.GetResourceSet(culture, true, true); 

     foreach(System.Collections.DictionaryEntry resource in resourceSet) 
     { 
      yield return resource.Key; 
     } 
    } 
    finally 
    { 
     resourceManager.ReleaseAllResources(); 
    } 
} 
+5

ऐसा लगता है कि 'GetResourcePaths' से लौटाए गए पथ कम हो गए हैं, इसलिए' संसाधन 'विशेषज्ञ' विधि में '.Contains (resourcePath.ToLower()) का उपयोग करना सुनिश्चित करें। –

+2

इसे '.ToLowerInvariant()' बस सुरक्षित होने के लिए बनाएं। – RandomEngy

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