【问题标题】:How to define a TabItem Header Template in WPF如何在 WPF 中定义 TabItem 标题模板
【发布时间】:2019-04-01 09:32:01
【问题描述】:

我正在学习 WPF,并阅读了一篇关于模板的文章。所以我想写一些代码,但我卡住了。 我想做什么?我的应用程序有一个 TabControl,我希望所有选项卡都具有相同的布局。一个 stackpanel,在 stackpanel 中有一个 Image 和一个 Textblock。

现在我不知道以后如何设置内容。我需要 ContentPresenter 吗?

<ControlTemplate x:Key="TabTemplate">
        <StackPanel Orientation="Horizontal">
            <Image></Image>
            <TextBlock></TextBlock>
        </StackPanel>
    </ControlTemplate>

【问题讨论】:

标签: wpf xaml templates


【解决方案1】:

在您的资源字典中添加带有所需模板的样式:

 <Style x:Key="CustomTabItemStyle"
           TargetType="{x:Type TabItem}">
        <Setter Property="FocusVisualStyle" Value="{x:Null}" />
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        <Setter Property="VerticalContentAlignment" Value="Stretch" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabItem}">
                    <Grid x:Name="Root"
                          Width="180"
                          Height="45"
                          Margin="0,0,0,0"
                          SnapsToDevicePixels="true">

                        <StackPanel Orientation="Horizontal">
                            <Image Width="90"
                                   Margin="10"
                                   VerticalAlignment="Center"
                              Source="pack://Application:,,,/img/myTabImage.png"
                                   Stretch="Uniform" />
                            <TextBlock x:Name="contentPresenter"
                                      HorizontalAlignment="Center"
                                      VerticalAlignment="Center"
                                      Focusable="False"
                                      FontSize="16"
                                      Foreground="White"
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                      Text="{TemplateBinding Header}" />
                        </StackPanel>
                    </Grid>                    
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

不要忘记编辑您的图片。如果所有选项卡都具有相同的图像,则只需更改源链接,否则,您可能需要另一个绑定,例如 Content.

然后在您的 TabItems 中简单地使用这种样式:

  <TabControl Margin="0,5,0,0"
              FocusVisualStyle="{x:Null}">
       <TabItem Header="My First Tab"
                IsSelected="{Binding FirstTabItemSelected}"
                Style="{DynamicResource CustomTabItemStyle}"> 
                    ... 
       </TabItem>
       <TabItem Header="My Second Tab"
                IsSelected="{Binding SecondTabItemSelected}"
                Style="{DynamicResource CustomTabItemStyle}"> 
                    ... 
       </TabItem>
   </TabControl>

【讨论】:

  • 嗨,也许你能帮帮我。我创建了类似的样式,整个网格在标题中生成。有了这个区别,我从cs文件中添加了这个。 pastebin.com/iMACWus9
  • @SilnyToJa 通过设置标签项的样式,您正在设置其标题的样式,因此这种行为是预期的。如果您希望网格位于正文/内容中,则无需为 TabItem 设置样式。相反,请尝试 tabItem.Content = myCustomGrid;,myCustomGrid 您需要单独定义(从资源中)。或者,您可以将 ContentTemplate/DataTemplate 设置为样式中的网格。希望对你有帮助
猜你喜欢
  • 1970-01-01
  • 2019-09-26
  • 2012-09-07
  • 2013-10-02
  • 2013-12-10
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多