2009-03-29 14 views
9

<Window.Resources> में मैं निम्नलिखित शैली को परिभाषित किया है:क्या एक्सएएमएल में एक शैली सेट करना संभव है जो चुनिंदा नियंत्रण को प्रभावित करता है?

<Style x:Key="textBlockStyle" TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 

मैं जहाँ मैं चार TextBlocks है कुछ ग्रिड को परिभाषित किया है:

<WrapPanel> 
     <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock> 
    </WrapPanel> 

समस्या: मैं textBlockStyle चार बार संदर्भित करने के लिए की जरूरत है।

प्रश्न: क्या शैली को संदर्भ के दोहराए बिना WrapPanel या कहीं और उस शैली को सेट करना संभव है?

हो सकता है कि कुछ की तरह:

<WrapPanel Style="{StaticResource textBlockStyle}"> 
     <TextBlock>Server</TextBlock> 
     <TextBlock>IP</TextBlock> 
     <TextBlock>Port</TextBlock> 
     <TextBlock>Status</TextBlock> 
    </WrapPanel> 

मैं एक वैश्विक समाधान के लिए खोज नहीं कर रहा हूँ! मैं उस x:Key="textBlockStyle" संपत्ति को हटा सकता हूं, लेकिन यह विंडो में सभीTextBlocks को प्रभावित करेगा। मुझे एक और चुनिंदा तंत्र की आवश्यकता है, लेकिन उस बदसूरत कोड डुप्लिकेशन के बिना।

उत्तर

17

आपके पास कितने अच्छे पैमाने पर प्रस्तुत किए गए हैं, यहां आपके पास कई विकल्प हैं।

विकल्प 1: एक निचले स्तर

आप WrapPanel स्तर पर संसाधन छड़ी कर सकते हैं पर एक कुंजी के बिना शैली को परिभाषित करें ताकि यह केवल अंदर कि WrapPanel नियंत्रण को प्रभावित करता है:

<WrapPanel> 
    <WrapPanel.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </WrapPanel.Resources> 

    <!-- TextBlocks here --> 
</WrapPanel> 

सूचना कुंजी की कमी यह Style एस पर WrapPanel के भीतर लागू होगा।

विकल्प 2: एक निचले स्तर

पर बिना एक कुंजी के साथ शैली को परिभाषित करें और फिर आप निर्धारित करते हैं Style एक कुंजी के साथ एक उच्च स्तर पर है, तो आप फिर एक और Style एक निचले स्तर पर बिना परिभाषित कर सकते हैं एक महत्वपूर्ण है, और उस Style उच्च स्तर पर आधार:

<Window> 
    <Window.Resources> 
     <Style TargetType="TextBlock" x:Key="textBlockStyle"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </Window.Resources> 

    <WrapPanel> 
     <WrapPanel.Resources> 
      <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/> 
     </WrapPanel.Resources> 

     <!-- TextBlocks here --> 
    </WrapPanel> 
</Window> 

यह एक Style में जो परिणाम स्वचालित रूप से WrapPanel अंदर TextBlock रों लागू किया जा रहा है, लेकिन नहीं यह बाहर। साथ ही, आप Style के विवरण डुप्लिकेट नहीं करते हैं - वे उच्च स्तर पर संग्रहीत होते हैं।

विकल्प 3: प्लेस एक ResourceDictionary में शैलियाँ और चुनिंदा यह विलय

अंत में, आप एक अलग ResourceDictionary में अपने Style रों जगह और चुनिंदा एक नियंत्रण के Resources संग्रह में है कि शब्दकोश विलय कर सकते हैं:

<!-- TextBlockStyles.xaml --> 
<ResourceDictionary> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</ResourceDictionary> 

<!-- Window.xaml --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="TextBlockStyles.xaml"/> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 

<!-- Alternative Window.xaml if you have only one RD to merge in --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary Source="TextBlockStyles.xaml"/> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 

अब आप अलग-अलग शब्दकोशों में परिभाषित कई स्टाइल सेट प्राप्त कर सकते हैं, और फिर चुनिंदा रूप से उन्हें अपने तत्व पेड़ पर लागू कर सकते हैं।

+0

मैं आमतौर पर विकल्प 2 पसंद करता हूं यदि मेरे पास शैली पहले ही परिभाषित है और इसे कहीं और उपयोग करें, अन्यथा विकल्प 1. इसके लिए क्या लायक है। महान जवाब केंट। –

2

yup, आप यह कर सकते हैं। आपको लगभग सही विचार है। {: प्रकार x} वाक्य रचना आप न जरूरत एक्स: कुंजी, यह wrappanel में सभी textblocks के लिए शैली सेट हो जाएगा आपको लगता है कि इस

<WrapPanel> 
< WrapPanel. Resources > 
<Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</WrapPanel.Resources/> 
     <TextBlock Server</TextBlock> 
     <TextBlock >IP</TextBlock> 
     <TextBlock >Port</TextBlock> 
     <TextBlock >Status</TextBlock> 
    </WrapPanel> 

का उपयोग करके की तरह .... करते हैं। यदि आप diff शैलियों को चाहते हैं, तो आप अभी भी x: कुंजी और स्पष्टीकरण का उपयोग टेक्स्टब्लॉक पर शैली सेट कर सकते हैं।

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

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