Пост stackoverflow прекрасно отвечает на мой вопрос.

я есть собственный ControlTemplate для WPF TabControl, который добавляет кнопки в левой и правой части заголовка TabItem. На данный момент это не именованная часть, так как команды кнопок связаны в XAML-шаблонах ControlTemplates и не должны отображаться вне ControlTemplate.

Это нормально работает для кнопки, но что, если я хочу добавитьсодержание с левой (или правой) стороны TabItemHeaders, которые могут быть связаны вне ControlTemplate, чтобы мой TabControl стал более гибким?

Моя идея состояла в том, чтобы создать подкласс TabControl и иметь две именованные части в ControlTemplate и представить их как свойства нового элемента управления;CustomTabControl.LeftContentArea а такжеCustomTabControl.RightContentArea соответственно. Каждая именованная часть представляет собой ContentPresenter, и каждое свойство ContentPresenters предоставляется вышеуказанными свойствами.

Однако, когда я попробовал это, я не смог поместить контент в левую и правую области контента.

Изменить: Просто чтобы быть ясно, я включил изображение. Красные прямоугольники показывают, где я хочу разместить дополнительный контент.

Обновление: ниже приведен скриншот прогресса, которого я добился до сих пор, надеюсь, это поможет объяснить мою проблему немного подробнее.

На снимке экрана показан мой пользовательский элемент управления вкладками с двумя пустыми вкладками и тремя кнопками, которые в настоящее время находятся справа отTabItem область заголовка В настоящее время кнопки определены вTabControls обычайControlTemplate И.Е. СуществуетColumnDefinition в пределахControlTemplates Сетка, которая содержитStackPanel который содержит 3 кнопки.

То, что я ищу, - это способ, позволяющий потребителю элемента управления вкладками решать, какой контент находится в области рядом с вкладками. НАПРИМЕР. пользователь должен иметь возможность сделать что-то вроде этого:

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

Ответы на вопрос(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>

Надеюсь, что это поможет, если что-то неясно или если этого недостаточно, оставьте комментарий.

 H.B.16 янв. 2011 г., 14:33
Вы можете привязать к этим ресурсам тоже на самом деле. Слева от TabItems, вы имеете в виду в области заголовка слева от всех вкладок?
 Benjamin Gale16 янв. 2011 г., 14:43
Да. В своем шаблоне пользовательского элемента управления я добавил дополнительное ColumnDefinition, чтобы вкладки были смещены, и было место для моего дополнительного содержимого, которое нужно добавить. Я хочу выставить свойство, которое позволяет мне размещать контент в этой области.
 Benjamin Gale16 янв. 2011 г., 14:31
Я ищу способ предоставления свойства в пользовательском элементе управления, чтобы я мог привязать его к этому, как это в XAML: LeftContentArea = "{StaticResource MyPanelWithLotsOfButtonsControl}". Пользовательский контент должен быть слева от TabItems, а не слева от заголовка. Это помогает мне с другой проблемой, с которой я столкнулся, поэтому я буду голосовать, когда у меня будет достаточно повторений. Спасибо.
 H.B.16 янв. 2011 г., 16:53
Вам нужно довольно сложное расширение, так как вам нужно переопределить ControlTemplate TabControl для размещения этих областей, одна проблема, с которой я столкнулся, заключалась в том, что относительные привязки к свойствам Horizontal и VerticalAlignment больше не работали, поскольку нужно было изменить визуальное дерево, что несколько разрушило раскладка.

который заключался в создании другой сетки, занимающей то же пространство, что и TabControl, т.е. оба находятся в Grid.Row = 0. Я связал высоту сетки с высотой первой вкладки, поэтому, если вкладки изменят высоту, остальные элементы управления останутся центрированными. Я установил MinWidth в окне, чтобы элементы управления не перекрывали вкладки.

Вставьте этот код в новое окно 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>

... и вы получите это:

Решение Вопроса

это Пост stackoverflow прекрасно отвечает на мой вопрос.

Ваш ответ на вопрос