WPF Что-то переопределяет выравнивание содержимого вкладки TabControl - PullRequest
0 голосов
/ 29 ноября 2018

Я использовал this в качестве отправной точки для создания стиля для TabControl, мой работает только с TabStripPlacement = "Bottom".Я ожидаю, что контент, который я поместил в TabItem, заполнил бы всю область, предназначенную для него, как это происходит со стилем по умолчанию и стилем от Microsoft, который я использовал в качестве отправной точки.Но это не так. Он начинается с минимальных размеров, кнопки вообще не растягиваются, и RichTextBoxes кажутся растянутыми только по горизонтали, если я добавлю текст в RichTextBox, который он расширяет.Вот как это выглядит:

No text Some text

Апельсин - это та область, которую я ожидаю, что содержимое займет (снекоторые поля), синий фон RichTextBox.Зеленый - это глобальный фон.У выбранной вкладки граница заголовка утолщена (красная).Не обращайте внимания на расстояние между заголовками вкладок и областью содержимого, это преднамеренно.

Я много возился, но не могу найти причину, однако я обнаружил, что яУ меня нет этой проблемы, если я не применяю стиль для TabItem.И когда я проверяю элементы с помощью инструментов отладки xaml в Visual Studio, я обнаруживаю, что горизонтальное выравнивание PART_SelectedContentHost имеет значение Left, а вертикальное выравнивание установлено Top, происходит, даже если я явно установил их в Stretch в стиле.Я также попытался применить «Stretch» ​​к RichTextBox, это не сработало.Вот стиль:

<Style TargetType="{x:Type TabControl}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabControl}">
                <Grid KeyboardNavigation.TabNavigation="Local" VerticalAlignment="Stretch">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="30" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                            Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                        <EasingColorKeyFrame KeyTime="0" Value="#FFAAAAAA" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <TabPanel x:Name="HeaderPanel"
                            Grid.Row="2"
                            Panel.ZIndex="1"
                            Margin="0"
                            IsItemsHost="True"
                            KeyboardNavigation.TabIndex="1"
                            Background="Transparent" />
                    <Border x:Name="Border"
                            Grid.Row="0"
                            Panel.ZIndex="0"
                            BorderThickness="0"
                            CornerRadius="0"
                            KeyboardNavigation.TabNavigation="Local"
                            KeyboardNavigation.DirectionalNavigation="Contained"
                            KeyboardNavigation.TabIndex="2"
                            VerticalAlignment="Stretch"
                            HorizontalAlignment="Stretch">
                        <Border.Background>
                            <SolidColorBrush Color="Orange"/>
                        </Border.Background>
                        <ContentPresenter 
                            x:Name="PART_SelectedContentHost"
                            Margin="4,4,4,4"
                            ContentSource="SelectedContent" 
                            VerticalAlignment="Stretch"
                            HorizontalAlignment="Stretch"/>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type TabItem}">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabItem}">
                <Grid x:Name="Root">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="SelectionStates">
                            <VisualState x:Name="Unselected" />
                            <VisualState x:Name="Selected">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="ContentSite"  
                                            Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)"
                                            From="White" To="Blue" 
                                            Duration="0:0:0.0" AutoReverse="True"/>
                                    <ThicknessAnimationUsingKeyFrames 
                                            Storyboard.TargetProperty="(Border.BorderThickness)"
                                            Storyboard.TargetName="Border">
                                        <EasingThicknessKeyFrame KeyTime="0"
                                                Value="1,5,1,5" />
                                    </ThicknessAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="MouseOver" />
                            <VisualState x:Name="Disabled"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border x:Name="Border"
                              Margin="0,0,0,0"
                              BorderThickness="1,1,1,1"
                              CornerRadius="0,0,0,0"
                                BorderBrush="Red">
                        <Border.Background>
                            <SolidColorBrush Color="Black"/>
                        </Border.Background>
                        <ContentPresenter x:Name="ContentSite"
                                  VerticalAlignment="Center"
                                  HorizontalAlignment="Center"
                                  ContentSource="Header"
                                  Margin="12,2,12,2"
                                  RecognizesAccessKey="True"
                                  TextBlock.Foreground="White"/>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Panel.ZIndex" Value="100"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

РЕДАКТИРОВАТЬ: Ради ясности, стиль сохраняется в файле xaml - "TabControlStyleDictionary.xaml", и это код основного окна:

<Window x:Class="TabControlStylingTest2.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"
    xmlns:local="clr-namespace:TabControlStylingTest2"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="TabControlStyleDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid Background="Green">
    <TabControl TabStripPlacement="Bottom">
        <TabItem Header="tab1">
            <RichTextBox 
                Foreground="White" 
                Background="Blue" 
                AcceptsReturn="True" 
                VerticalAlignment="Stretch" 
                HorizontalAlignment="Stretch"/>
        </TabItem>
        <TabItem Header="tab2">
            <Button
                HorizontalAlignment="Stretch" 
                VerticalAlignment="Stretch">
                some text 123456789
            </Button>
        </TabItem>
    </TabControl>
</Grid>

...