2012-02-25 18 views
5

क्या कंटेनर के पहले (या अंतिम या nth) बच्चे को शैलियों को लागू करने का कोई तरीका है (कुछ भी जिसमें बच्चे हैं)? मैं टैब आइटम्स के रूप को कस्टमाइज़ करने की कोशिश कर रहा हूं ताकि पहले व्यक्ति के मुकाबले अलग-अलग सीमा त्रिज्या हो।शैली को पहले बच्चे को लागू करें?

<ControlTemplate TargetType="{x:Type TabItem}"> 
    <Grid> 
     <Border Name="Border" BorderBrush="#666" BorderThickness="1,1,1,0" CornerRadius="8,8,0,0" Margin="0,0,0,-1"> 
      <TextBlock x:Name="TabItemText" Foreground="#444" Padding="6 2" TextOptions.TextFormattingMode="Display"> 
       <ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Header" Margin="12,2,12,2"/> 
      </TextBlock> 
     </Border> 
    </Grid> 
</ControlTemplate> 

उत्तर

6

(इस तरह के TabControl के रूप में) ItemsControl व्युत्पन्न वर्ग के लिए, आप ItemContainerStyleSelector निर्भरता संपत्ति का उपयोग कर सकते हैं। जब यह निर्भरता प्रॉपर्टी सेट की जाती है, तो आइटम्स कंट्रोल नियंत्रण में प्रत्येक आइटम के लिए StyleSelector.SelectStyle() को कॉल करेगा। यह आपको विभिन्न वस्तुओं के लिए विभिन्न शैलियों का उपयोग करने की अनुमति देगा।

निम्न उदाहरण एक TabControl में अंतिम टैब आइटम बदल कर अपने पाठ को बोल्ड है और थोड़ा अन्य टैब से भी बड़ा।

पहले, नई StyleSelector वर्ग:

class LastItemStyleSelector : StyleSelector 
{ 
    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     var itemsControl = ItemsControl.ItemsControlFromItemContainer(container); 
     var index = itemsControl.ItemContainerGenerator.IndexFromContainer(container); 

     if (index == itemsControl.Items.Count - 1) 
     { 
      return (Style)itemsControl.FindResource("LastItemStyle"); 
     } 

     return base.SelectStyle(item, container); 
    } 
} 

इस शैली चयनकर्ता कुंजी "LastItemStyle" लेकिन केवल नियंत्रण में अंतिम आइटम के लिए के साथ शैली वापस आ जाएगी। अन्य आइटम डिफ़ॉल्ट शैली का उपयोग करेंगे। (ध्यान दें, यह फ़ंक्शन केवल आइटम्सकंट्रोल के सदस्यों का उपयोग करता है। इसका उपयोग अन्य आइटम्स कंट्रोल व्युत्पन्न कक्षाओं के लिए भी किया जा सकता है।) इसके बाद, आपके एक्सएएमएल में, आपको पहले दो संसाधन बनाने की आवश्यकता है। पहला संसाधन इस LastItemStyleSelector के लिए होगा और दूसरा संसाधन शैली है।

<Window.Resources> 
    <local:LastItemStyleSelector x:Key="LastItemStyleSelector" /> 

    <Style x:Key="LastItemStyle" TargetType="TabItem"> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="FontSize" Value="16" /> 
    </Style> 
</Window.Resources> 

फिर अंत में अपने TabControl:

<TabControl ItemContainerStyleSelector="{StaticResource LastItemStyleSelector}"> 
     <TabItem Header="First" /> 
     <TabItem Header="Second" /> 
     <TabItem Header="Third" /> 
    </TabControl> 

अधिक जानकारी के लिए MSDN दस्तावेज़ देखें:

+0

यह गतिशील सामग्री के लिए काम नहीं करेगा क्योंकि @RFactor को स्पष्ट रूप से आवश्यकता है, क्योंकि जब कोई नया टैब जोड़ा जाता है तो आइटमकंटर्स को पुनर्निर्मित नहीं किया जाता है। तो, अंत में एक "नया" टैब जोड़ें, और इसे भी "LastItemStyle" असाइन किया जाएगा। – WiredPrairie

1

HTML और सीएसएस के विपरीत, निर्धारित और परिवर्तन के प्रकार को गति प्रदान करने का आसान तरीका नहीं है:

यह वही है मैं अब है।

आप संभवतः एक ट्रिगर लिख सकते हैं और एक मूल्य कनवर्टर का उपयोग संभावित this forum post प्रेरणा के रूप में उपयोग करते हुए ऐसे ही कुछ करने के लिए कर सकता है।

बहुत सरल TabItem है कि आप अलग अलग देखने के लिए चाहते हैं के लिए एक कस्टम शैली लागू करना होगा। क्या आपने कोशिश की है?

<TabItem Header="TabItem" Style="{DynamicResource FirstTabStyle}"> 
    <Grid Background="#FFE5E5E5"/> 
</TabItem> 
+0

बात यह है कि टी है abs को फिर से व्यवस्थित किया जाता है, हटा दिया जाता है और किसी भी समय जोड़ा जाता है। इसलिए मुझे उन शैलियों को भी जोड़ना होगा (और हटाएं)। – Tower

+0

ठीक है - आपके प्रश्न ने उस आवश्यकता को नहीं बताया। :) – WiredPrairie

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