2009-08-04 11 views
41

हैं, मेरे पास कई संसाधन शब्दकोश XAML फ़ाइलों के साथ एक लाइब्रेरी, CommonLibraryWpfThemes है। मेरी थीम्स/जेनेरिक.एक्सएमएल फ़ाइल में एक संसाधन डिक्शनरी है। मर्ज किए गए डिक्शनरी घोषणा जो सभी अन्य फ़ाइलों को एक साथ विलय करती है।एक संसाधन शब्दकोश का संदर्भ देने में समस्या जिसमें मर्ज किए गए शब्दकोश

Generic.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary 
      Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" /> 
     <ResourceDictionary 
      Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" /> 
     <ResourceDictionary 
      Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" /> 
     <ResourceDictionary 
      Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" /> 
     <ResourceDictionary 
      Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

अपने आवेदन परियोजना में, मैं CommonLibraryWpfThemes के लिए एक संदर्भ है, और मुझे स्पष्ट रूप से मेरी App.xaml फ़ाइल में Generic.xml के संदर्भ हैं।

App.xaml - विफल रहता है

<Application 
    x:Class="MyApp.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 
     <ResourceDictionary 
      Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" /> 
    </Application.Resources> 
</Application> 

यह काम नहीं करता। अगर मैं App.xaml में Generic.xaml की सामग्री को जगह

System.Windows.Markup.XamlParseException occurred 
    Message="Cannot find resource named '{_fadedOrangeBrush}'. Resource names are case sensitive. Error at object 'System.Windows.Setter' in markup file 'CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml' Line 18 Position 13." 
    Source="PresentationFramework" 
    LineNumber=18 
    LinePosition=13 

सीधे, सब कुछ ठीक काम करता है: जब मैं अपने अनुप्रयोग चलाने मैं निम्नलिखित त्रुटि मिलती है

App.xaml - सफल होता है

<Application 
    x:Class="MyApp.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" /> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" /> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" /> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" /> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

शायद मैं गलत तरीके से इस बारे में जा रहा हूँ। मेरा लक्ष्य सभी व्यक्तिगत फ़ाइलों को सूचीबद्ध करने के बिना कई अनुप्रयोगों से मेरे सभी थीम संसाधनों को संदर्भित करना आसान बनाना है। क्या ऐसा करने का कोई अनुशंसित तरीका है? (नोट: मैं एकाधिक विषयों के बीच स्विच करने की कोशिश नहीं कर रहा हूं - मेरे पास सिर्फ एक थीम है।)

बोनस के रूप में, यह अच्छा होगा अगर कोई मुझे बता सके कि बाहरी पुस्तकालय में संसाधनों को संदर्भित करने के बिना कैसे विजुअल स्टूडियो में डिजाइनर।

धन्यवाद।

संपादित करें:

मैं एक ResourceDictionary.MergedDictionary तत्व में ResourceDictionary लपेटकर कोशिश की, लेकिन वह भी काम नहीं किया (मैं एक ही त्रुटि मिलती है):

<Application 
    x:Class="MyApp.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 
+1

मैं यहां एक छोटा सा उपहार शुरू करूंगा। कुछ रेसॉर्स डिक्शनरी को थीम में जोड़ना (और इसे ऐप.एक्सएएमएल में लोड करना) एक सामान्य पर्याप्त परिदृश्य लगता है ... – Jens

उत्तर

4

आप नहीं करना चाहिए generic.xaml को संदर्भित करने के लिए, इसमें अंतर्निहित समर्थन है। इसका मतलब यह है कि यह डिफ़ॉल्ट स्टाइल प्रदान करता है, जिसे आप स्पष्ट रूप से सेट नहीं करते हैं। स्पष्ट रूप से संदर्भित res शब्दकोशों से स्पष्ट रूप से सेट शैलियों/टेम्पलेट्स को प्राप्य होने की आवश्यकता है।

(स्पष्टता के लिए संपादित करें) यह करने के लिए

एक अपवाद किसी भी विशिष्ट संसाधन शब्दकोश संदर्भित करने के लिए की आवश्यकता के बिना App.xaml, जहां परिभाषित संसाधनों पूरे एप्लिकेशन द्वारा सुलभ हो जाता है। संसाधन स्वयं, नाम से सुलभ होना होगा।

कारण है कि यह विफल

<Application.Resources> 
    <ResourceDictionary 
     Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" /> 
</Application.Resources> 

, क्योंकि आप इसे एक MergedDictionary आवरण में लपेट नहीं किया था, मर्ज किए गए शब्दकोशों में जोड़ने से है मुझे लगता है,। संसाधनों में सीधे जोड़ना केवल उन संसाधनों के लिए काम करता है जिन्हें आप स्थानीय रूप से घोषित करते हैं, उदा। शैलियों, आदि खुद।

लेकिन, जैसा कि मैंने पहले कहा, तुम कहीं भी generic.xaml मर्ज करने के लिए, होना चाहिए नहीं हो सकता है आप सिर्फ ब्रश और अन्य संसाधनों शैलियों बाहर किया refactor करना चाहिए, और app.xaml में केवल उन संसाधनों मर्ज करें।

यह भी ध्यान रखें कि शैली को "डिफ़ॉल्ट शैली" व्यवहार के लिए जेनेरिक.एक्सएएमएल में होना जरूरी नहीं है - यदि तत्व के प्रकार के बराबर कुंजी वाला एक शैली इसके लिए सुलभ है (वैश्विक स्तर पर, या स्थानीय संसाधनों में), तो यह शैली को डिफ़ॉल्ट शैली के रूप में उपयोग करेगा। generic.xaml सिर्फ एक सुविधा है।

this उत्तर देखें।

अन्य कस्टम ब्रश आदि के लिए, आपको उन संसाधनों को स्पष्ट रूप से संदर्भित करने की आवश्यकता है।

आपको WindowDictionary.xaml की सामग्री भी जांचनी चाहिए, इस त्रुटि में इसके बारे में एक निश्चित गंध है।

+0

तो मुझे लगता है कि आप कह रहे हैं कि सीधे संसाधनों को संदर्भित करना App.xaml में आवश्यक है और यह एकमात्र तरीका होगा काम। अर्थात।, मेरे सभी शब्दकोशों को "पूर्व-विलय" करने का कोई तरीका नहीं है और केवल App.xaml से पूर्व विलय वाली इकाई का संदर्भ लें। सुविधाजनक नहीं है, लेकिन अगर यह काम करता है, तो यह दुनिया का अंत नहीं है। अब तक, मैं हमेशा * {StaticResource MyResourceName} 'का उपयोग करके अपने स्टाइल विशेषताओं को स्पष्ट रूप से सेट करता हूं, इसलिए मुझे लगता है कि जेनेरिक.एक्सएमएल अनुमति देता है कि डिफ़ॉल्ट व्यवहार का लाभ उठाने के लिए मुझे बहुत सी चीजों को दोबारा करना होगा। क्या मेरे पास वह अधिकार है? – devuxer

+0

जब आप app.xaml के साथ शब्दकोश मर्ज करते हैं, तो आप संसाधनों को "वैश्विक" बनाते हैं, जो पूरे ऐप (नाम राज्यों के रूप में) द्वारा सुलभ होते हैं। App.xaml में संसाधनों को शब्दकोश नाम के माध्यम से संदर्भित करने की आवश्यकता नहीं है, केवल विशिष्ट संसाधन कुंजी के माध्यम से, मैं उस पर अस्पष्ट हो सकता हूं, मैं जवाब को स्पष्ट कर दूंगा। मैं आम तौर पर ऐप के विभिन्न हिस्सों के लिए समूहीकृत मर्ज किए गए शब्दकोश बनाते हैं और संदर्भ के अनुसार xaml में शब्दकोश का संदर्भ देता हूं। –

+0

आपके उत्तर को स्पष्ट करने के लिए धन्यवाद, लेकिन या तो मैं इसका मतलब गलत तरीके से व्याख्या कर रहा हूं कि "इसे 'MergedDictionary' wrapper में लपेटें" या यह काम नहीं करता है। मैंने कोड प्रश्न के साथ अपने प्रश्न के निचले हिस्से में एक संपादन किया। – devuxer

12

App.xaml.cs में अपने निर्माता की जाँच करें कॉल InitializeComponent() - इस

+2

यह मेरे लिए काफी मददगार था। मैं यह पता लगाने की क्यों मेरे पृष्ठ (एक फ्रेम में आयोजित) नहीं मिल रहा थे कोशिश कर रहा था संसाधनों मेरी App.xaml में परिभाषित ऐसा लगता है कि निर्माता बुला नहीं किया गया था InitializeComponent धन्यवाद क्रिस !!!! – NathanAW

-1

मेरे समाधान here है, समाधान क्लिक करके देखें कि संसाधन शब्दकोशों विलीन हो जाती है है ...।

+1

के लिए नीचे वोट दिया: लिंक पाठ के बिना लिंक; जो भी कोई स्पष्टीकरण नहीं; बाह्य सामग्री - सामग्री पर कोई नियंत्रण नहीं।। – trapicki

65

पहले यहां एक समान प्रश्न का उत्तर दिया गया, Adding a Merged Dictionary to a Merged Dictionary प्रश्न देखें। , XAML में हर वस्तु के निर्माण पर

अगर एक डिफ़ॉल्ट शैली मौजूद है (यानी शैली w/प्रकार की एक प्रमुख) कि शैली को:

यह एक अनुकूलन बग है, Microsoft Connect/DefaultStyleKey style not found in inner MergedDictionaries देखना लागू होना। जैसा कि आप कल्पना कर सकते हैं कि कई प्रदर्शन ऑप्टिमाइज़ेशन हैं (अंतर्निहित) जितना संभव हो उतना हल्का वजन तलाशें। उनमें से एक यह है कि हम संसाधन शब्दकोशों के अंदर नहीं देखते हैं जब तक कि वे "डिफ़ॉल्ट शैलियों" के रूप में फ़्लैग किए गए हों। एक बग है: यदि आपकी सभी डिफॉल्ट शैलियों को मर्ज किए गए शब्दकोष में तीन स्तर गहरे (या गहरे) में घोंसला हैं, तो शीर्ष शब्दकोश फ़्लैग नहीं होता है, इसलिए खोज इसे छोड़ देती है। आसपास के काम को रूट डिक्शनरी में कुछ भी, कुछ भी स्टाइल डालना है।

तो रूट शब्दकोश में एक डमी शैली जोड़ना इसे ठीक करता है। उदाहरण

<Application x:Class="MyApp.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary 
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" /> 
       </ResourceDictionary.MergedDictionaries> 
      <!-- Dummy Style, anything you won't use goes --> 
      <Style TargetType="{x:Type Rectangle}" /> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 
+0

बग केवल .NET 4: 4.0.30319.1008 के पुराने संस्करणों में मौजूद प्रतीत होता है। मैंने इसे XP पर देखा है और कुछ अन-अद्यतन विंडोज 7 स्थापना। –

0

मैं अपने इकाई परीक्षण में इस त्रुटि हो रही थी और ऊपर से 'क्रिस जवाब मुझे सुराग मैं जरूरत दे दी है। असल में मेरा पहला परीक्षण किया पद्धति पर, मैं डाल:

 MyApplication.App app = new MyApplication.App(); 
     app.InitializeComponent(); 

और अचानक यह अपने पृष्ठों के लिए मेरे टेम्पलेट मिल सका। नोट: इसका मतलब यह है कि आपको यह देखने के लिए जांचना है कि क्या आपकी ऐप का एक उदाहरण पहले से मौजूद है यदि आप इकाई को अपने App.cs का परीक्षण भी कर रहे हैं।

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