【问题标题】:WPF Styles for TabControl / TabPanel / TabItemTabControl / TabPanel / TabItem 的 WPF 样式
【发布时间】:2011-03-31 19:38:17
【问题描述】:

这是一个关于 WPF TabControl、TabItem 和 TabPanel 的新手问题。 StackOVF 上有一个相关的问题,我很乐意在我的应用程序中使用一个答案。这是答案的链接,以及代码 sn-p:

WPF: Center TabItems in a 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>

虽然这很棒,但我希望将资源和样式的内容移到更好的位置(样式表等)。我的第一次尝试是将&lt;TabControl.Resources&gt; 标签移动到&lt;Window.Resources&gt;,但这不起作用。我尝试了几种变体,但无法使其正常工作。下面是一个我有点期待的尝试示例:

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

搜索 web 和 msdn 并没有帮助我解决我的问题,而是给我留下了第二个(相关的)问题:实际上 TabPanel,以及它与 TabControl 有何关系?

任何帮助和提示将不胜感激。

(已编辑:在上一个示例中评论说代码对我不起作用。)

【问题讨论】:

    标签: wpf xaml tabcontrol tabpanel


    【解决方案1】:

    您可能需要创建一个 ControlTemplate 来执行此操作。

    我对 ControlTemplates 还不是很熟悉。我破解了这个例子: 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>
    

    【讨论】:

    • 感谢克里斯的想法。我看到了这样的示例,但这似乎有很多代码只是为了更改选项卡标题的一个布局属性,因为它使您创建整个 ControlTemplate。也许大师可以提出第二个意见,告诉我们这是否是要走的路?
    • 我知道你的意思 :) 我一直在尝试改变 Expander 的外观,但这不是一个简单的过程。所以我也希望有人有更好的方法:)
    【解决方案2】:

    TabControl 使用一个专门的 TabPanel 类,而不是像 StackPanel 这样的通用面板,因为如果你乱用 TabControl,你会意识到面板做了很多通用面板不做的事情。一种是在多行中调整选项卡标题项。另一个是项目的行将重新排列,以便选定的 tabitem 标题始终位于最后一行。我想它可能会做得更多

    我很想知道为什么将样式放在窗口资源部分不起作用。我最初的反应是在我尝试之前它应该可以工作。我将其添加为答案,因为 SO 不允许我在评论中添加图片。

    【讨论】:

    • “我最初的反应是在我尝试之前它应该可以工作。”啊!所以我 am 仍然理智 :) 感谢您对 TabPanel NVM 的解释。说得通。我在调查期间发现的一个“线索”(如果我理解正确的话)是 TabPanel 没有 XAML(似乎)。例如,您不能将&lt;TabPanel /&gt; 元素添加到TabControl。 (编辑评论)
    • 有点晚了,但是通过我的旧问题,我实际上看到你回答了我的一个问题。信用到期:)
    猜你喜欢
    • 2018-04-21
    • 2012-09-07
    • 2021-03-30
    • 1970-01-01
    • 2010-12-03
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多