2011-01-16 15 views
5

Mam niestandardowy ControlTemplate dla WPF TabControl, który dodaje przyciski po lewej i prawej stronie nagłówka TabItem. W tej chwili nie jest to nazwana część, ponieważ polecenia przycisku są powiązane w ControlTemplates XAML i nie muszą być odsłonięte poza ControlTemplate.Jak mogę dodać dodatkową zawartość do elementu TabControl WPF?

Działa to dobrze dla przycisku, ale co zrobić, jeśli chcę dodać zawartości w lewo (lub prawo) strony TabItemHeaders który może być związany poza ControlTemplate tak, że mój TabControl staje się bardziej elastyczne?

Mój pomysł polegał na podklasie TabControl i posiadaniu dwóch nazwanych części w ControlTemplate i odsłonięciu ich jako właściwości nowego kontrolki; CustomTabControl.LeftContentArea i CustomTabControl.RightContentArea odpowiednio. Każda nazwana część to ContentPresenter, a każda właściwość Content Content prezentowana jest przez właściwości wymienione powyżej.

Jednak gdy próbowałem tego, nie byłem w stanie umieścić treści w lewej i prawej części zawartości.

Edycja: Aby było jasne, załączam zdjęcie. Czerwone prostokąty pokazują, gdzie chcę umieścić dodatkową zawartość.

alt text

Update: Poniżej znajduje się zrzut ekranu z postępów, jakie dokonane do tej pory, mam nadzieję, że to pomoże wyjaśnić mój problem nieco bardziej.

Zrzut ekranu pokazuje moją niestandardową kontrolkę tabulacji z dwoma pustymi kartami i trzema przyciskami, które są aktualnie po prawej stronie obszaru nagłówka TabItem. Przyciski są obecnie zdefiniowane w Tab. Tab.ControlTemplate I.E. istnieje ColumnDefinition w sieci ControlTemplates, która zawiera StackPanel, która zawiera 3 przyciski.

alt text

Co szukam to sposób, aby umożliwić konsumentowi kontroli zakładce decydować, jakie treści idzie w obszarze obok zakładek. NA PRZYKŁAD. użytkownik powinien być w stanie zrobić coś takiego:

<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> 

Odpowiedz

2

Dla każdego, kto jest zainteresowany this stackoverflow post odpowiada na moje pytanie idealnie.

3

W zależności od tego ile elastyczność trzeba istnieją pewne sposoby, które nadają się lepiej niż inni, ja spróbuje użyć DynamicResources jeśli to możliwe, ponieważ jest zwykle mniej kłopotliwe niż tworzenie nowych kontrolek użytkownika.

Oto przykład, w jaki sposób dodać dodatkową zawartość do lewej strony TAB-Header:

<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> 

nadzieję, że pomoże, jeśli coś jest niejasne lub jeśli to nie wystarczy, spadek komentarz.

+0

szukam sposób wystawiając nieruchomość w formancie niestandardowym, więc mogę go powiązać z tym w XAML: LeftContentArea = "{StaticResource MyPanelWithLotsOfButtonsControl}". Niestandardowa zawartość musi znajdować się po lewej stronie TabItems, a nie po lewej stronie nagłówka. Pomaga mi to w innym problemie, który miałem, więc przegłosuję, gdy mam już dość przedstawicieli. Dziękuję Ci. –

+0

Możesz również powiązać z tymi zasobami. Po lewej stronie TabItems, masz na myśli w obszarze Nagłówek po lewej stronie wszystkich zakładek? –

+0

Tak. W moim niestandardowym szablonie kontroli dodałem dodatkowe ColumnDefinition, dzięki czemu karty są przesunięte i jest miejsce na dodanie dodatkowej zawartości. Chcę ujawnić właściwość, która pozwala mi umieszczać treści w tym obszarze. –

3

Próbowałem inny (leniwy) sposób, który był do stworzenia innej siatki, która zajmuje tę samą przestrzeń, co TabControl, tj. Oba są w Grid.Row = 0.Związałem wysokość siatki do wysokości pierwszej zakładki, więc jeśli zakładki zmieniają wysokość, pozostałe elementy sterujące pozostaną wyśrodkowane. Ustawiłem MinWidth na oknie, więc kontrolki nie nakładają się na zakładki.

Wklej ten kod w nowym oknie 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> 

... a dostaniesz to:

enter image description here

Powiązane problemy