2013-03-15 7 views
14

लागू नहीं होता है क्योंकि मेरे पास मेरे आवेदन में एकाधिक Window एस है, मैं एक ऐसे समाधान की तलाश में हूं जिसके लिए मुझे प्रत्येक Window पर binding सेट करने की आवश्यकता नहीं है।संसाधन डिक्शनरी से विंडोज स्टाइल

मैं एक ResourceDictionary जो विंडो पृष्ठभूमि के लिए एक style है बनाया:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="Background" Value="AliceBlue"/> 
</Style> 

मेरी XAML में, मैं सेट ResourceDictionary:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Templates.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

कोई त्रुटि नहीं है, लेकिन मेरे Window रंग रहता है सफेद।

+0

Window.Resources के बजाय Application.Resources प्रयास करें – LPL

+0

अपने 'ResourceDictionary है:

<Style x:Key="MyWindowStyle"> <Setter Property="Window.Background" Value="AliceBlue"/> </Style> 

फिर, अपने विंडो में, </Window.Resources> के बाद निम्नलिखित शामिल हैं आपकी परियोजना के रूट फ़ोल्डर में xaml फ़ाइल? –

+1

@ एलपीएल: इसे अभी भी 'विंडोज़' स्रोतों में काम करना चाहिए। –

उत्तर

-2

विंडो पृष्ठभूमि संपत्ति

<Window x:Class="GDD.Presentation.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="300" Width="300" 
    Background="{StaticResource WindowBackground}"> 
+4

उत्तर के लिए धन्यवाद, लेकिन अगर मेरे पास गुणक विंडो हैं, तो मुझे प्रत्येक के लिए पृष्ठभूमि सेट करने की आवश्यकता है, इसलिए मैं शैली का उपयोग करना चाहता हूं सीधे! –

+0

डाउनवॉटेड स्टेटिक रिसोर्स को स्पष्ट रूप से सेट करने के लिए। – lightxx

+5

यदि जिस व्यक्ति ने प्रश्न उठाया है, वह उत्तर उपयुक्त पाया गया है और इसे स्वीकार कर लिया है, तो मुझे कोई कारण नहीं दिख रहा है कि क्यों इसे स्टेटिक रिसोर्स को निश्चित रूप से सेट किया जा रहा है! अगर जवाब पूरी तरह से अप्रासंगिक या गलत है, तो किसी को केवल नीचे वोट देना चाहिए, क्योंकि किसी ने सर्वोत्तम अभ्यास का उपयोग नहीं किया है। –

27

इस का एक संयोजन की वजह से प्रतीत होता है करने के लिए आवश्यक संसाधन अपने संसाधन शब्दकोश

<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 के लिए स्वत: स्टाइल वायरअप कभी भी इस तरह से काम नहीं करेगा, और मैन्युअल बाइंडिंग के कुछ स्तर दुर्भाग्यवश हमेशा आवश्यक होंगे।

+1

यह स्वीकार्य उत्तर होना चाहिए! – lightxx

+0

इस स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। –

2

यह वह समाधान है जिसका मैंने अपने आवेदन में उपयोग किया था। यह मुझे अपनी सभी खिड़की शैलियों को एक साथ रखने देता है, और <Window.Resources> अनुभाग के बाद बस कुछ पंक्तियों की आवश्यकता होती है।

करें अपने Style तो जैसे:

<Window.Style> 
    <Style BasedOn="{StaticResource MyWindowStyle}"/> 
</Window.Style> 
संबंधित मुद्दे