2011-01-16 10 views
5

मेरे पास एक WPF TabControl के लिए कस्टम कंट्रोल टेम्पलेट है जो टैबइटम हेडर के बाएं और दाएं हाथ की ओर बटन जोड़ता है। फिलहाल यह एक नामित हिस्सा नहीं है क्योंकि बटन कमांड कंट्रोल टेम्पलेट्स XAML में बंधे हैं और ControlTemplate के बाहर प्रकट होने की आवश्यकता नहीं है।मैं एक WPF TabControl में अतिरिक्त सामग्री कैसे जोड़ सकता हूं?

यह एक बटन के लिए ठीक काम करता है, लेकिन क्या अगर मैं बाईं ओर सामग्री जोड़ना चाहते हैं (या सही) TabItemHeaders जो ControlTemplate के बाहर बाध्य किया जा सकता है ताकि मेरे TabControl अधिक लचीला हो जाता है की हाथ की ओर?

मेरा विचार टैबकंट्रोल को उप-वर्ग करना था और नियंत्रण टेम्पलेट में दो नामित भाग हैं और इन्हें नए नियंत्रण के गुणों के रूप में बेनकाब करना है; कस्टमटैबकंट्रोल। लेफ्टकंटेंट एरिया और कस्टमटाबकंट्रोल। राइटकंटेंट एरिया क्रमशः। प्रत्येक नामित भाग एक सामग्री प्रस्तुतकर्ता है और प्रत्येक सामग्री प्रस्तुतकर्ता सामग्री संपत्ति उपर्युक्त गुणों द्वारा उजागर की जाती है।

हालांकि, जब मैंने कोशिश की तो मैं सामग्री को बाएं और दाएं सामग्री क्षेत्रों में रखने में असमर्थ था।

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

alt text

अद्यतन: नीचे प्रगति मैं अब तक बना दिया है की एक स्क्रीन शॉट है, उम्मीद है कि इस में मदद मिलेगी मेरी समस्या समझाने में थोड़ा और अधिक।

स्क्रीन शॉट दो कस्टम टैब और तीन बटनों के साथ मेरा कस्टम टैब नियंत्रण दिखाता है जो वर्तमान में टैबआईटेम हेडर क्षेत्र के दाईं ओर स्थित हैं। बटन वर्तमान में टैबकंट्रोल कस्टम नियंत्रण टेम्पलेट आईई में परिभाषित किए गए हैं। कॉलमडिफिनिशनकंट्रोल टेम्पलेट्स ग्रिड जिसमें स्टैकपैनल है जो 3 बटन होस्ट करता है।

alt text

क्या मैं देख रहा हूँ टैब नियंत्रण से उपभोक्ता यह तय करें कि सामग्री टैब के बगल में क्षेत्र में चला जाता है की अनुमति के लिए एक तरीका है। E.G. उपयोगकर्ता इस तरह कुछ करने के लिए सक्षम होना चाहिए:

<local:CustomTabControl> 
    <local:CustomTabControl.RightContentArea> 
     <!-- This can be changed to ANY content that the user wants --> 
     <StackPanel Orientation="Horizontal"> 
      <Button Content="Test" /> 
      <Button Content="Test" /> 
      <Button Content="Test" /> 
     </StackPanel> 
    </local:CustomTabControl.RightContentArea> 

    <!-- TabItems are added as normal --> 
    <TabItem Header="Tab One" /> 
    <TabItem Header="Tab Two" /> 

</local:CustomTabControl> 

उत्तर

2

रुचि रखने वाले किसी भी व्यक्ति के लिए this स्टैक ओवरफ्लो पोस्ट मेरे प्रश्न का पूरी तरह उत्तर देता है।

3

आप कितना लचीलेपन की जरूरत है वहाँ कुछ तरीके कि दूसरों से बेहतर अनुकूल हैं कर रहे हैं पर निर्भर करता है, क्योंकि यह आम तौर पर कम परेशानी है मैं अपने आप यदि संभव हो तो DynamicResources उपयोग करने का प्रयास नए उपयोगकर्ता नियंत्रण बनाने से।

<TabControl> 

    <TabControl.Resources> 
     <DataTemplate x:Key="AugmentedTabItem"> 
      <StackPanel Orientation="Horizontal"> 
       <ContentPresenter Content="{DynamicResource ContentLeft}" Margin="0,0,5,0"/> 
       <ContentPresenter Content="{Binding}"/> 
      </StackPanel> 
     </DataTemplate>  
    </TabControl.Resources> 

    <TabItem Header="ÜberTab" HeaderTemplate="{StaticResource AugmentedTabItem}"> 
     <TabItem.Resources> 
      <TextBlock x:Key="ContentLeft" Text=">>>" Foreground="Blue"/>   

     </TabItem.Resources> 
    </TabItem>  
</TabControl> 

आशा है कि, में मदद करता है अगर कुछ स्पष्ट नहीं है या अगर यह पर्याप्त नहीं है, एक टिप्पणी छोड़:

यहाँ कैसे टैब हैडर के बाईं ओर अतिरिक्त सामग्री जोड़ने के लिए का एक उदाहरण है।

+0

मैं संपत्ति उजागर करने का एक तरीका के लिए देख रहा हूँ एक कस्टम नियंत्रण में, इसलिए मैं इसे XAML में बाध्य कर सकता हूं: LeftContentArea = "{StaticResource MyPanelWithLotsOfButtonsControl}"। कस्टम सामग्री को हेडर के बाईं ओर TabItems के बाईं ओर होना आवश्यक है। इससे मुझे एक और समस्या के साथ मदद मिलती है, इसलिए मेरे पास पर्याप्त प्रतिनिधि होने के बाद मैं ऊपर हट जाऊंगा। धन्यवाद। –

+0

आप वास्तव में उन संसाधनों से भी जुड़ सकते हैं। TabItems के बाईं ओर, क्या आप हेडर क्षेत्र में सभी टैब के बाईं ओर मतलब रखते हैं? –

+0

हां। मेरे कस्टम कंट्रोल टेम्पलेट में मैंने एक अतिरिक्त कॉलमडिफिनिशन जोड़ा है ताकि टैब ऑफसेट हो जाएं और मेरी अतिरिक्त सामग्री को जोड़ने के लिए एक जगह है। मैं ऐसी संपत्ति का खुलासा करना चाहता हूं जो मुझे इस क्षेत्र में सामग्री डालने की अनुमति दे। –

3

मैंने एक अलग (आलसी) तरीका की कोशिश की, जो एक और ग्रिड बनाने के लिए था जो टैबकंट्रोल के समान स्थान पर है, यानी दोनों ग्रिड.रो = 0 में हैं।मैंने ग्रिड ऊंचाई को पहले टैब की ऊंचाई तक सीमित कर दिया है ताकि यदि टैब ऊंचाई बदल जाए तो अन्य नियंत्रण केंद्रित रहेगा। मैंने खिड़की पर मिनीविड्थ सेट किया है ताकि नियंत्रण टैब को ओवरलैप न करें।

एक नया WPF विंडो में यह कोड पेस्ट करें ...

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
Title="MainWindow" Height="306" Width="490" MinWidth="300"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TabControl Grid.Row="0" x:Name="tabControl"> 
     <TabItem x:Name="tabItem" Header="TabItem" Height="50"> 
      <Grid Background="#FFE5E5E5"/> 
     </TabItem> 
     <TabItem Header="TabItem"> 
      <Grid Background="#FFE5E5E5"/> 
     </TabItem> 
    </TabControl> 

    <Grid Grid.Row="0" Height="{Binding ActualHeight, ElementName=tabItem}" 
     VerticalAlignment="Top" Margin="0,2,0,0"> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" 
       VerticalAlignment="Center" Margin="20,0"> 
      <TextBlock VerticalAlignment="Center" Margin="10,0" FontSize="16" 
        Foreground="Red" FontFamily="Calibri">My Text</TextBlock> 
      <Button Content="My Button" /> 
     </StackPanel> 
    </Grid> 

</Grid> 
</Window> 

... और आप इस मिल जाएगा:

enter image description here

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