gpt4 book ai didi

c# - WPF TabItem Header - 强制按钮占用整个 Header 空间

转载 作者:行者123 更新时间:2023-11-30 20:50:05 27 4
gpt4 key购买 nike

我需要在单击 WPF TabItem header 时执行命令。

由于 Button 有一个命令,我想我应该将 Button 放在 TabItem 标题中。

我希望 Button 占据 TabItem Header 的全部内容,但无论我如何尝试,我都无法做到这一点。

这是我的简单 XAML 窗口:

enter image description here

TestWindow.xaml

<Window x:Class="ActivePDFMonitor.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="300" Width="300">
<Grid>
<TabControl>
<TabItem Header="Tab 1">
<TextBlock Text="Hello, world"/>
</TabItem>
<TabItem>
<TabItem.HeaderTemplate>
<DataTemplate>
<Button Content="+" Background="Green"></Button>
</DataTemplate>
</TabItem.HeaderTemplate>
<TextBlock Text="Tab 2 contents"/>
</TabItem>
</TabControl>
</Grid>
</Window>

这是我试过的,但没有用

  1. 设置按钮属性 HorizontalAlignment="Stretch" , VerticalAlignment="Stretch" , HorizontalContentAlignment="Stretch" , VerticalContentAlignment="Stretch" - 无视觉效果

  2. 将其他面板(WrapPanel、DockPanel)包裹在 Button 周围 - 无视觉效果

  3. 将按钮包装在 <Viewbox> 中- 由于某种原因,这使得按钮占据了整个窗口。

我想我不需要按钮,如果有某种方法我可以将命令附加到整个 TabItem header (这将是一个可能的解决方案)。

但是,我绝对不想使用 TabControl 的 SelectionChanged 来触发新选项卡的添加(沿着那条路走下去,发现它很脆弱,因为 SelectionChanged 是不可预测的)。

我一直在敲这个,看起来应该很简单。任何想法或见解将不胜感激。

最佳答案

WPF 的 TabPanel控制不会那样摆动。您将需要重新模板 TabControl使用不同的面板。 DockPanel产生您要求的效果:

Tabcontrol using a dockpanel

<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<SolidColorBrush x:Key="TabItem.Selected.Background" Color="#FFFFFF"/>
<SolidColorBrush x:Key="TabItem.Selected.Border" Color="#ACACAC"/>
<Style x:Key="TabControlStyle1" TargetType="{x:Type TabControl}">
<Setter Property="Padding" Value="2"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="{StaticResource TabItem.Selected.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource TabItem.Selected.Border}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid x:Name="templateRoot" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
<Grid.RowDefinitions>
<RowDefinition x:Name="RowDefinition0" Height="Auto"/>
<RowDefinition x:Name="RowDefinition1" Height="*"/>
</Grid.RowDefinitions>
<!-- here is the edit -->
<DockPanel x:Name="headerPanel" Background="Transparent" Grid.Column="0" IsItemsHost="true" Margin="2,2,2,0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1" />
<Border x:Name="contentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<TabControl Style="{DynamicResource TabControlStyle1}">
<TabItem Header="Tab 1" DockPanel.Dock="Left">
<TextBlock Text="Hello, world"/>
</TabItem>
<TabItem Header="Tab 2" DockPanel.Dock="Left">
<TextBlock Text="Hello, world"/>
</TabItem>
<TabItem Header="Foo bar" />
</TabControl>
</Grid>
</Window>

如果你想在标题中有一个按钮,没有 TabItem 包装器,你可以重新模板化一个 TabItem。您仍然需要处理通过键盘或其他方式选择 TabItem 的情况。

Button in a tabitem template

        <TabItem>
<TabItem.Template>
<ControlTemplate>
<Button>hello</Button>
</ControlTemplate>
</TabItem.Template>
</TabItem>

关于c# - WPF TabItem Header - 强制按钮占用整个 Header 空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22824925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com