Стили WPF для TabControl / TabPanel / TabItem - PullRequest
8 голосов
/ 19 августа 2010

Вот новый вопрос о WPF TabControl, TabItem и TabPanel. На StackOVF есть связанный вопрос с ответом, который я с радостью использовал в своем приложении. Вот ссылка на ответ, а также фрагмент кода:

WPF: Центр TabItems в TabControl

<TabControl>
    <TabControl.Resources>
        <Style TargetType="{x:Type TabPanel}">
            <Setter Property="HorizontalAlignment" Value="Center" />
        </Style>
    </TabControl.Resources>

    <TabItem Header="Test 1" />
    <TabItem Header="Test 2" />
    <TabItem Header="Test 3" />
    <TabItem Header="Test 4" />
</TabControl>

Хотя это замечательно, я бы хотел переместить материал «Ресурсы и стиль» в лучшее место (таблицу стилей или тому подобное). Моей первой попыткой было перенести тег <TabControl.Resources> на <Window.Resources>, но это не сработало. Я попробовал несколько вариантов, но не смог заставить его работать. Вот пример попытки, которую я несколько ожидал, сработает:

<!-- Doesn't work as expected: -->
<Window.Resources>
    <Style TargetType="{x:Type TabPanel}">
        <Setter Property="HorizontalAlignment" Value="Center" />
    </Style>
</Window.Resources>

Поиск в сети и MSDN не помогли мне решить мою проблему, но вместо этого оставили мне второй (связанный) вопрос: что на самом деле является TabPanel, и как это связано с TabControl?

Любая помощь и советы будут высоко оценены.

(Отредактировано: в последнем примере прокомментировал, что код не работает для меня.)

Ответы [ 2 ]

10 голосов
/ 19 августа 2010

alt text

TabControl использует специализированный класс TabPanel, а не универсальную панель, такую ​​как StackPanel, потому что, если вы возитесь с TabControl, вы поймете, что панель делает довольно много вещей, которых нет в обычных панелях. Одним из них является настройка элементов заголовка вкладки в несколько рядов. Другое состоит в том, что строки элементов будут переставлены так, чтобы выбранный заголовок табуляции всегда был в последней строке. Я думаю, что это может сделать еще больше

Мне очень интересно узнать, почему не удается поместить стиль в раздел ресурсов окна. Моей первоначальной реакцией было то, что она должна работать, пока я не попробую. Я добавляю это как ответ, потому что ТАК не позволю мне добавить изображение в комментарии.

1 голос
/ 19 августа 2010

Для этого вам, вероятно, потребуется создать ControlTemplate.

Я еще не очень знаком с ControlTemplate.Я взломал этот пример из: http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.tabpanel.aspx

<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">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <TabPanel Name="HeaderPanel"
                                  Grid.Row="0"
                                  Panel.ZIndex="1" 
                                  Margin="0,0,4,-1" 
                                  IsItemsHost="True"
                                  KeyboardNavigation.TabIndex="1"
                                  HorizontalAlignment="Center"/>
                      </Grid>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
...