Интервал между заголовками WPF TabControl, прямоугольник фокуса клавиатуры не выравнивается

#c# #wpf #xaml #tabcontrol

#c# #wpf #xaml #tabcontrol управление вкладками

Вопрос:

Я устанавливаю ControlTemplates на пробел между элементами TabItems, но прямоугольник фокусировки клавиатуры больше не выравнивается:

введите описание изображения здесь

Кто-нибудь знает простой способ исправить это?

Вот упрощенный пример кода:

 <TabControl x:Name="tabControl">
    <TabControl.Resources>
        <ControlTemplate x:Key="tabItemTemplate"
                         TargetType="{x:Type TabItem}">
            <Grid x:Name="templateRoot" Margin="0,0,40,0">
                <Border BorderBrush="LightGray"
                        BorderThickness="1"/>
                <ContentPresenter ContentSource="Header"
                                  Margin="10,5"/>
            </Grid>
        </ControlTemplate>
    </TabControl.Resources>
    <TabItem Header="TabItem" Template="{StaticResource tabItemTemplate}"/>
    <TabItem Header="TabItem" Template="{StaticResource tabItemTemplate}"/>
    <TabItem Header="TabItem" Template="{StaticResource tabItemTemplate}"/>
</TabControl>
 

Ответ №1:

Самый простой способ, который я нашел, — настроить FocusVisualStyle и предоставить ему поле, аналогичное тому, которое использовалось для выделения вкладок.

Пример:

 <TabControl x:Name="tabControl">
    <TabControl.Resources>
        <Style x:Key="tabItemStyle" TargetType="TabItem">
            <Setter Property="FocusVisualStyle">
                <Setter.Value>
                    <Style>
                        <Setter Property="Control.Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Rectangle Margin="2,2,42,2" SnapsToDevicePixels="True"
                                            Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
                                            StrokeDashArray="1 2" StrokeThickness="1" />
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid x:Name="templateRoot" Margin="0,0,40,0">
                            <Border BorderBrush="LightGray" BorderThickness="1" />
                            <ContentPresenter Margin="10,5" ContentSource="Header" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TabControl.Resources>
    <TabItem Header="TabItem" Style="{StaticResource tabItemStyle}" />
    <TabItem Header="TabItem" Style="{StaticResource tabItemStyle}" />
    <TabItem Header="TabItem" Style="{StaticResource tabItemStyle}" />
</TabControl>
 

введите описание изображения здесь

Этот пользовательский FocusVisualStyle параметр является модифицированной версией значения по умолчанию (я скорректировал поле), которое я извлек из фиктивного TabItem файла через окно свойств:

введите описание изображения здесь

Ответ №2:

попробуйте сделать сетку фокусируемой, а табуляцию не табуляцией.

    <TabControl x:Name="tabControl">
            <TabControl.ItemContainerStyle>
                <Style TargetType="TabItem">
                    <Setter Property="IsTabStop" Value="False"/>
                </Style>
            </TabControl.ItemContainerStyle>
            <TabControl.Resources>
                <ControlTemplate x:Key="tabItemTemplate"
            TargetType="{x:Type TabItem}">
                    <Grid x:Name="templateRoot" Margin="0,0,40,0" Focusable="True">
                        <Border BorderBrush="LightGray"
                        BorderThickness="1"/>
                        <ContentPresenter ContentSource="Header"
                                  Focusable="False"
                                  Margin="10,5"/>
                    </Grid>
                </ControlTemplate>
            </TabControl.Resources>
        <TabItem Header="TabItem" Template="{StaticResource tabItemTemplate}" />
        <TabItem Header="TabItem" Template="{StaticResource tabItemTemplate}" />
        <TabItem Header="TabItem" Template="{StaticResource tabItemTemplate}" />
    </TabControl>
 

Комментарии:

1. Прямоугольник фокусировки выглядит правильно, но я теряю возможность переключать вкладки с помощью клавиш со стрелками. Я пробую несколько вариантов, но пока безуспешно.

2. попробуйте установить TabIndex в сетке, возможно, привязанный к чему-то в вашем «классе TabItem»