इस का एक संयोजन की वजह से प्रतीत होता है करने के लिए आवश्यक संसाधन अपने संसाधन शब्दकोश
<SolidColorBrush x:Key="WindowBackground" Color="AliceBlue" />
में और अपने WPF विंडो में एक नया ब्रश जोड़े बस सेट जिस क्रम में डब्ल्यूपीएफ ने नेस्टेड ResourceDictionary
से शैलियों को लोड/प्रोसेस किया है, और Window
वर्ग के विनिर्देश।
मान लीजिए MainWindow
आपकी पोस्ट के अनुसार परिभाषित किया गया है। अब डाल Templates.xaml
में निम्नलिखित:
<Style TargetType="{x:Type Window}">
<Setter Property="Background" Value="Red"/>
</Style>
<Style TargetType="{x:Type Window}" x:Key="myStyle">
<Setter Property="Background" Value="Green"/>
</Style>
तो MainWindow
कोई शैली में परिभाषित किया गया है, तो आप डिजाइनर यह एक लाल रंग की पृष्ठभूमि के साथ प्रकट होता है कि देखेंगे। डिजाइनर पूरे Xaml को पार्स कर रहा है और संसाधन शब्दकोश लोड कर रहा है, और उसके बाद परिणाम खींच रहा है। खिड़की खींची जाने से पहले शैली पढ़ी जाती है, और इसलिए लाल पृष्ठभूमि लागू होती है।
जब आप एप्लिकेशन चलाते हैं, तो विंडो ResourceDictionary
लागू होने से पहले बनाई गई है। यह एक डिफ़ॉल्ट शैली (x:Key="{x:Type Window}"
के साथ एक शैली) से पहले घोंसला ResourceDictionary
संसाधित हो गया है, और कुछ भी नहीं मिला है। इसलिए रनटाइम पर, विंडो डिफ़ॉल्ट रंग के साथ दिखाई देती है। (यह उपरोक्त टिप्पणियों में वर्णित व्यवहार है।) याद रखें कि x:Key="{x:Type Window}"
के साथ शैली का डिफ़ॉल्ट मान है जो विंडोज शैली से मेल खाता है।
यदि आप myStyle
स्पष्ट रूप से उपयोग करते हैं तो यह उत्पन्न होता है। यदि आप Window
परिभाषा को Style="{StaticResource myStyle}"
परिभाषा में जोड़ते हैं तो आपको पता चलेगा कि डिज़ाइनर विफल रहता है, लेकिन आपको रन-टाइम त्रुटि भी मिलती है, क्योंकि विंडो को इसकी आवश्यकता होने पर myStyle
नहीं बनाया गया है। यदि आप Style="{DynamicResource myStyle}"
पर स्विच करते हैं तो आप देखेंगे कि यह आपके काम के अनुसार काम करता है, क्योंकि DynamicResource
अपडेट हो जाएगा ResourceDictionary
को पार्स किया गया है और शैली शामिल है।
तो, इसे लागू करने के बाद, आप इसे अपने विंडो तत्व में जोड़कर समस्या को ठीक से ठीक कर सकते हैं: Style="{DynamicResource {x:Type Window}}"
- लेकिन यह अव्यवस्थित है।
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Templates.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
यहाँ असली मुद्दा है कि आपके Window
वास्तव में एक Window
नहीं है: बेहतर समाधान app.xaml
फ़ाइल है, जहां यह सब करने से पहले किसी भी विंडो खोला है पार्स किया जाएगा और इस प्रकार उपलब्ध में अपने संसाधन शब्दकोश शामिल करने के लिए है : यह एक वर्ग है जो Window
से निकला है और वास्तव में MainWindow
, Window2
, आदि होगा ...इसका मतलब है कि Window
के लिए स्वत: स्टाइल वायरअप कभी भी इस तरह से काम नहीं करेगा, और मैन्युअल बाइंडिंग के कुछ स्तर दुर्भाग्यवश हमेशा आवश्यक होंगे।
Window.Resources के बजाय Application.Resources प्रयास करें – LPL
अपने 'ResourceDictionary है:
फिर, अपने विंडो में,
</Window.Resources>
के बाद निम्नलिखित शामिल हैं आपकी परियोजना के रूट फ़ोल्डर में xaml फ़ाइल? –@ एलपीएल: इसे अभी भी 'विंडोज़' स्रोतों में काम करना चाहिए। –