2009-02-25 13 views
22

मुझे आश्चर्य है कि डायनामिक स्रोतों के साथ wpf शैलियों की आधारित ऑन प्रॉपर्टी का उपयोग करने का कोई तरीका है या नहीं। जैसेडायनेमिक स्रोतों पर आधारित ऑन स्टाइल प्रॉपर्टी का उपयोग

<Style BasedOn="{DynamicResource somestyle}"> 
    <Setter Property="SomeProp" Value="SomeValue"/> 
</Style> 

यह उदा। एक त्रुटि उत्पन्न करता है जो दर्शाता है कि आधारितऑन शैलियों के संयोजन में गतिशील स्रोतों का उपयोग संभव नहीं है। मुझे आश्चर्य है कि कोई ऐसा कैसे कर सकता है? धन्यवाद

उत्तर

15

मुझे लगता है कि मुख्य कारण सीलबंद वस्तुओं है। यदि आपके पास स्टाइल पदानुक्रम है:

 Style A 
    /  \ 
    Style A1 Style A2 

यह एक कठिन परिदृश्य नहीं हो सकता है। आप गतिशील संसाधन का उपयोग करके StyleA का संदर्भ लें, इसलिए जब भी वह संसाधन बदलता है, Style A1 और Style A2 को उनकी BasedOn संपत्ति बदलनी चाहिए। हालांकि, आपके आवेदन में स्टाइल का उपयोग होने के बाद, यह एक सीलबंद वस्तु बन जाता है। Style A अपरिवर्तनीय हो जाता है।

एक वैकल्पिक हल आप उपयोग कर सकते है:

  1. Style A बदलने की जरूरत है।
  2. नया स्टाइल ऑब्जेक्ट बनाएं जो नया Style A संसाधन होगा।
  3. Style A1 और Style A2 का एक नया संस्करण बनाएं। आपको एक प्रतिलिपि प्रक्रिया लिखनी होगी जो सभी Setters, Resources आदि की प्रतियां बनाती है। Style A के नए संस्करण में सेट करें।
  4. संसाधन संग्रह अद्यतन करें ताकि तीन नई शैलियों वहां हों।

{DynamicResource StyleA1} और {DynamicResource StyleA2} अब तथ्य यह है कि उन संसाधनों परिवर्तन (चरण 4 से) और किसी भी संदर्भ स्वचालित रूप से अपडेट लेने चाहिए।

ध्यान दें कि यह एक बहुत ही सरल परिदृश्य है। असली दुनिया शैली पदानुक्रम अधिक जटिल हो सकते हैं, खासकर अगर वे कई फाइलों में फैले हुए हैं और मर्ज किए गए शब्दकोशों से आते हैं।

आशा है कि मैं आपकी समस्या को समझता हूं और मदद करता हूं।

+4

इस परिदृश्य के बारे में कैसे - एक अलग (यूएक्स) टीम आधार शैलियों का निर्माण करती है ... एक डेवलपर आधार शैली के अलावा कुछ गुणों को सेट करना चाहता है।आदर्श रूप में यह एक परिदृश्य है जहां देवस्टाइल आधारित "डायनामिक रिसोर्स यूक्स स्टाइल" ने मदद की होगी .. यदि यह संभव नहीं है, तो इसे नियंत्रित करने से पहले 2 शैलियों को मर्ज करने के विकल्प क्या हैं? – Gishu

12

मैं पाया है कि जब से तुम एक DynamicResource पर BasedOn उपयोग नहीं कर सकते, तो आप StaticResource करने के लिए "परिवर्तित" कर सकते हैं DynamicResourceResourceDictionary विलय अपने वर्तमान विंडो/UserControl/जो कुछ भी करने के लिए अपने "जनक" संसाधनों पकड़ कर। इस प्रकार आप StaticResource का उपयोग कर संसाधन ऑब्जेक्ट (उदाहरण के लिए Style) का संदर्भ ले सकते हैं। इस तरह आप DatatriggersDynamicResource (रूपांतरण के माध्यम से) का उपयोग कर सकते हैं।

उदाहरण:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/MyProject.Styles;component/ButtonStyles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     [*Your other resources can be put here*] 
    </ResourceDictionary> 
</Window.Resources> 

... 

<Button Command="{Binding MyCommandInViewModel, RelativeSource={RelativeSource AncestorType=Window}}"> 
    <Button.Style> 
     <Style BasedOn="{StaticResource StyleFromButtonStyles}" TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SomeBool}" Value="True"> 
        <Setter Property="Button.Content" Value="{StaticResource SomeImage}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding SomeBool}" Value="False"> 
        <Setter Property="Button.Content" Value="{StaticResource SomeOtherImage}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

इसलिए Datatriggers एक बटन एक आयातित ResourceDictionary में स्टाइल के लिए लागू कर रहे हैं।

आशा है कि इससे मदद मिलती है!

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