我有一个使用以下 XAML 的 TabControl。

<TabControl x:Class="MyApp.Tab.TabContainer"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:MyApp.Tab"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300"
        ItemsSource="{Binding}">

<TabControl.Resources>
    <Style TargetType="TextBox">
        <Setter Property="VerticalAlignment" Value="Stretch"></Setter>
        <Setter Property="HorizontalAlignment" Value="Stretch"></Setter>
        <Setter Property="AcceptsReturn" Value="True"></Setter>
        <Setter Property="TextWrapping" Value="WrapWithOverflow"></Setter>
        <Setter Property="MaxLines" Value="5000"></Setter>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"></Setter>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"></Setter>
    </Style>

    <SolidColorBrush x:Key="mouseOverColor" Color="Red"></SolidColorBrush>
    <RadialGradientBrush x:Key="glowColor" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5" GradientOrigin="0.5,0.5">
        <GradientStop Color="Red" Offset="0.5"></GradientStop>
    </RadialGradientBrush>
    <RadialGradientBrush x:Key="glowMask" Center="0.5,0.5" RadiusX="0.5" RadiusY="0.5" GradientOrigin="0.5,0.5">
        <GradientStop Color="#80FFFFFF" Offset="0"></GradientStop>
        <GradientStop Color="#80FFFFFF" Offset="0.6"></GradientStop>
        <GradientStop Color="#00FFFFFF" Offset="1"></GradientStop>
    </RadialGradientBrush>

    <DataTemplate x:Key="NewTabHeaderTemplate" DataType="{x:Type local:AddNewTab}">
        <DockPanel>
            <TextBlock Name="TextBlock" VerticalAlignment="Center" Text="+" FontSize="18" MouseLeftButtonDown="TextBlock_OnMouseLeftButtonDown"></TextBlock>
        </DockPanel>
    </DataTemplate>

    <DataTemplate x:Key="MapTabHeaderTemplate" DataType="local:ACTabItemTabItem">
        <DockPanel>
            <Button Name="btn_TabDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" Click="btn_TabDelete_Click" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Name}">
                <Image Source="icon_grey_cross.gif" Height="9" Width="9" Margin="0,0,0,0"></Image>
                <Button.Template>
                    <ControlTemplate TargetType="Button">
                        <Border x:Name="bdr_main" Margin="4" BorderThickness="0" >
                            <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Margin="4,4,4,4" ContentSource="Content" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="bdr_main" Property="Background" Value="{StaticResource glowColor}"></Setter>
                                <Setter TargetName="bdr_main" Property="OpacityMask" Value="{StaticResource glowMask}"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
            </Button>
            <TextBlock VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Header}"></TextBlock>
        </DockPanel>
    </DataTemplate>
</TabControl.Resources>
public class AddNewTab : TabItem {}

在构造函数期间,我这样做是为了在标题中生成一个带有简单“+”的空白选项卡。
_tabItems = new ObservableCollection<ACTabItem>();
try
{
    AddNewTab tabAdd = new AddNewTab();
    tabAdd.HeaderTemplate = this.FindResource("NewTabHeaderTemplate") as DataTemplate;
    _tabItems.Add(tabAdd);
}
this.DataContext = _tabItems;

当用户单击“+”时,我会创建一个新的 TabItem 并将其添加到 Items 集合中。然后我尝试将新标签放在前面。 (ImplementTab() 只是创建一个新的 TabItem,其中一些值由 'td' 的内容预设)。
//code up here just collects some data from user to populate 'td'

TabItem newTab = ImplementTab(td);

if (newTab != null)
{
    _tabItems.Add((ACTabItem)newTab);
    newTab.Focus();
}

如果我观察 this_SelectionChanged() 事件处理程序,我会看到 Focus() 调用确实导致 SelectedIndex 更改为新添加的选项卡的索引,但我也看到在该方法之后新选项卡代码完成(紧随其后) Focus()),SelectionChanged 再次被抛出,但这次 SelectedIndex 为“0”(带有“+”标题的原始空白选项卡)。

单击选项卡只会抛出 SelectionChanged 一次,我得到了预期的结果。

我只是想让 TabControl 专注于新添加的 TabItem ......我是怎么搞砸的?

最佳答案

如果您进行数据绑定(bind),我觉得您不必从 TabItem 继承您的 AddNewTab。它应该是任何类,从 TabItem 继承它会使它变得困惑,因为 TabControl 将创建一个新的 TabItem 来环绕此数据项,因此您创建的选项卡上的 Focus() 等所有方法都将无效。

要选择最后一个选项卡,只需设置 SelectedIndex 而不是调用 Focus。

if (TabControl1.Items.Count > 0)
    TabControl1.SelectedIndex = TabControl1.Items.Count - 1;

关于c# - 粗鲁的标签不断出现在前面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24042917/

10-13 02:21