J'ai créé un menu contextuel pour un tabcontrol qui change le nom de l'onglet. Cependant, si la souris survole un onglet non sélectionné et que le clic droit de la souris sur le menu contextuel apparaît. Si je clique sur l'élément de menu, le nom de l'onglet sélectionné change. Par exemple, j'ai fait un clic droit sur l'onglet Favoris 4 et j'ai essayé de changer son nom, mais il a changé le nom du premier onglet (onglet sélectionné) comme indiqué ci-dessous.

enter image description here

Je voudrais sélectionner l'onglet avec le clic droit de la souris ainsi qu'avec le clic gauche de la souris afin que cela ne cause pas de confusion ou de changement de nom d'onglet intentionnel.

XAML

 <TabControl x:Name="FavoritesTabs" HorizontalAlignment="Stretch" Height="23" 
 Initialized="FavoritesTabs_Initialized" Margin="8,0,7,0" 
 MouseRightButtonDown="FavoritesTabs_MouseRightButtonDown" MouseEnter="FavoritesTabs_MouseEnter" >

   <TabControl.ContextMenu>
      <ContextMenu Name="tabContextMenu">
         <MenuItem Header="Change Tab Name" Click="MenuItem_Click" />
         <MenuItem Header="Save Favorite Layers" />
      </ContextMenu>
   </TabControl.ContextMenu>

</TabControl>
                

C #

private void FavoritesTabs_Initialized(object sender, EventArgs e)
{
    FavoritesList.Add("Favorite 1");
    FavoritesList.Add("Favorite 2");
    FavoritesList.Add("Favorite 3");
    FavoritesList.Add("Favorite 4");
    FavoritesTabs.ItemsSource = FavoritesList;
}

private void FavoritesTabs_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{

}

private void MenuItem.Click(object sender, RoutedEventArgs e)
{
    int index = FavoritesTabs.SelectedIndex;
    FavoritesList[index] = "New tab";            
}

J'ai essayé cette réponse mais cela n'a pas fonctionné.

0
Amadeus 7 nov. 2020 à 00:16

1 réponse

Meilleure réponse

Vous devez styliser votre événement d'ajout TabControl pour MouseDown, puis sélectionner l'élément d'onglet en conséquence.

Voici le code:

XAML

Au début, vous devez définir des ressources pour le style TabControl et également un style pour un Grid. Ce dernier est nécessaire car vous ne pouvez pas définir directement un gestionnaire d'événements dans le style TabControl.

<Window x:Class="WpfApp7.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp7"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.Resources>
    <Style x:Key="GridStyle" TargetType="Grid">
        <EventSetter Event="Mouse.MouseDown" Handler="UIElement_OnMouseDown"/>
    </Style>

    <Style x:Key="TabcontrolStyle"  TargetType="{x:Type TabControl}">
    <Style.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Height="20"
                              Background="{TemplateBinding Background}"
                              SnapsToDevicePixels="true"
                              Style="{StaticResource GridStyle}">
                            <ContentPresenter Margin="10,0"
                                              HorizontalAlignment="Center"
                                              VerticalAlignment="Center"
                                              ContentSource="Header" >
                            </ContentPresenter>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter Property="Background" Value="Transparent" />
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" Value="{x:Static SystemColors.ControlBrush}" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter Property="Background" Value="{x:Static SystemColors.ActiveCaptionBrush}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
    <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"
                                  Panel.ZIndex="1"
                                  IsItemsHost="True"
                                  KeyboardNavigation.TabIndex="1" />
                    <ContentPresenter Name="PART_SelectedContentHost"
                                      Margin="10"
                                      Grid.Row="1"
                                      ContentSource="SelectedContent" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    </Style>
    
</Window.Resources>
<Grid>
    <TabControl x:Name="MyTabControl" Style="{StaticResource TabcontrolStyle}">
        
        <TabControl.ContextMenu>
            <ContextMenu Name="tabContextMenu">
                <MenuItem Header="Change Tab Name" />
                <MenuItem Header="Save Favorite Layers" />
            </ContextMenu>
        </TabControl.ContextMenu>

        <TabItem Header="First">First Content</TabItem>
        <TabItem Header="Second">Second Content</TabItem>
        <TabItem Header="Third">Third Content</TabItem>
    </TabControl>
</Grid>

Code derrière

Dans le code derrière, vous pouvez égaler l'en-tête TabItem pour sélectionner le TabItem en conséquence.

private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
    {
        ContentPresenter contentPresenter = null;

        if (e.Source is Grid)
            contentPresenter = (ContentPresenter) ((Grid) e.Source).Children[0];
        else if (e.Source is ContentPresenter)
            contentPresenter = ((ContentPresenter) e.Source);

        if (contentPresenter == null) return;

        var header = contentPresenter.Content.ToString();

        var selectedIndex = -1;
        foreach (var item in this.MyTabControl.Items)
        {
            selectedIndex++;

            var tabItem = item as TabItem;

            if (tabItem?.Header != null && tabItem.Header.ToString().Equals(header, StringComparison.InvariantCultureIgnoreCase))
            {
                this.MyTabControl.SelectedIndex = selectedIndex;
            }
        }
    }
1
trix 9 nov. 2020 à 15:48