Как найти элемент в списке просмотра wpf после второго щелчка правой кнопкой мыши?

Конечно, я чего-то не понимаю, но надеюсь, вы сможете мне помочь.

У меня есть представление списка wpf, определенное следующим образом:

      <ListView x:Name="listviewPlugins" ItemContainerStyle="{StaticResource ItemContainerStylePlugin}" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.RowSpan="2" BorderBrush="White" 
                                      AllowDrop="True" Drop="listviewPlugins_Drop" DragEnter="listviewPlugins_DragEnter"
                                      PreviewMouseLeftButtonDown="listviewPlugins_PreviewMouseLeftButtonDown" ContextMenuOpening="listviewPlugins_ContextMenuOpening"
                                      MouseMove="listviewPlugins_MouseMove"
                                      KeyDown="listviewPlugins_KeyDown" >
                                <ListView.ContextMenu>
                                    <ContextMenu Style="{StaticResource ContextMenus}" x:Name="PluginContextMenu" StaysOpen="False">
                                        <MenuItem Style="{StaticResource MenuItemStyle}" x:Name="MenuConfigurePlugin" Header="{DynamicResource configurePlugin}" Click="MenuConfigurePlugin_Click" HorizontalAlignment="Left">
                                            <MenuItem.Icon>
                                                <materialDesign:PackIcon Foreground="Gray" Kind="Pencil" LayoutTransform="{StaticResource ContextMenuIconScaleTransform}"/>
                                            </MenuItem.Icon>
                                        </MenuItem>
                                        <Separator Style="{StaticResource ContextMenuSeparator}"></Separator>
                                        <MenuItem Style="{StaticResource MenuItemStyle}" x:Name="MenuDuplicatePlugin" Header="{DynamicResource duplicatePlugin}" Click="MenuDuplicatePlugin_Click" HorizontalAlignment="Left">
                                            <MenuItem.Icon>
                                                <materialDesign:PackIcon Foreground="Gray" Kind="ContentCopy" LayoutTransform="{StaticResource ContextMenuIconScaleTransform}"/>
                                            </MenuItem.Icon>
                                        </MenuItem>
                                        <Separator Style="{StaticResource ContextMenuSeparator}"></Separator>
                                        <MenuItem Style="{StaticResource MenuItemStyle}" x:Name="MenuRemovePlugin" Header="{DynamicResource deletePlugin}" Click="MenuRemovePlugin_Click" HorizontalAlignment="Left">
                                            <MenuItem.Icon>
                                                <materialDesign:PackIcon Foreground="Gray" Kind="ToyBrickRemoveOutline"  LayoutTransform="{StaticResource ContextMenuIconScaleTransform}"/>
                                            </MenuItem.Icon>
                                        </MenuItem>
                                    </ContextMenu>
                                </ListView.ContextMenu>
                                <ListView.View>
                                    <GridView x:Name="listviewPluginsColumns" ColumnHeaderContainerStyle="{StaticResource GridViewHeaderStyle}">
                                        <GridViewColumn Header="{DynamicResource PluginName}" Width="220" >
                                            <GridViewColumn.CellTemplate>
                                                <HierarchicalDataTemplate>
                                                    <StackPanel Height="21" Margin="0"  Orientation="Horizontal" VerticalAlignment="Center">
                                                        <Image Source="{Binding Icon}" Width="20" Height="20"></Image>
                                                        <TextBlock Text="{Binding Name}" VerticalAlignment="Center"></TextBlock>                                                            
                                                    </StackPanel>
                                                </HierarchicalDataTemplate>
                                            </GridViewColumn.CellTemplate>
                                        </GridViewColumn>
                                        <GridViewColumn  Header="{DynamicResource PluginDescription}" Width="250" >
                                            <GridViewColumn.CellTemplate>
                                                <HierarchicalDataTemplate>
                                                    <StackPanel Height="21" Margin="0"  Orientation="Horizontal" VerticalAlignment="Center">
                                                        <TextBlock Text="{Binding UserDescription}" VerticalAlignment="Center"></TextBlock>
                                                    </StackPanel>
                                                </HierarchicalDataTemplate>
                                            </GridViewColumn.CellTemplate>
                                        </GridViewColumn>
                                    </GridView>
                                </ListView.View>
                            </ListView>

Если я щелкну правой кнопкой мыши по одному элементу, меню откроется, и проблем не возникнет.

Но если я нажму на другой элемент, когда меню открыто, меню закроется и откроется снова, но выбранный элемент по-прежнему останется ранее выбранным элементом. Как я могу убедиться, что выбранный элемент находится под курсором мыши?

Я попробовал этот код в PreviewMouseRightButtonDown, но не могу заставить ListViewItem или Item выбрать его:

      var hit = VisualTreeHelper.GetParent(VisualTreeHelper.HitTest(listviewPlugins,Mouse.GetPosition(listviewPlugins)).VisualHit)

Спасибо за помощь.

Обновлять :

      private void MenuRemovePlugin_Click(object sender, RoutedEventArgs e)
    {
        RemoveSelectedPlugin();
        return;

    }

private void RemoveSelectedPlugin()
    {
        if (MessageBox.Show(cultureHelper.GetCultureString("deletePluginConfirmationContent"), cultureHelper.GetCultureString("deletePluginConfirmationTitle"), MessageBoxButton.YesNo, MessageBoxImage.Exclamation) == MessageBoxResult.Yes)
        {
            PluginInterface.Plugin source = (PluginInterface.Plugin)listviewPlugins.SelectedItem;
            
            Configuration.Data.CfgJob job = (Configuration.Data.CfgJob)listviewJobs.SelectedItems[0];
            job.RemovePlugin(source);
            listviewPlugins.ItemsSource = null;
            listviewPlugins.ItemsSource = job.Plugins;
        }
    }

1 ответ

Вы могли бы переместитьContextMenuизListViewконтролировать себя в контейнере:

      <ListView x:Name="listviewPlugins">
    <ListView.Resources>
        <ContextMenu x:Key="contextMenu">
            ...
        </ContextMenu>
    </ListView.Resources>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="ContextMenu" Value="{StaticResource contextMenu}" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView x:Name="listviewPluginsColumns" ... />
    </ListView.View>
</ListView>

...а затем легко получить ссылку на родителяListViewItemили егоDataContextв обработчике событий:

      private void MenuRemovePlugin_Click(object sender, RoutedEventArgs e)
{
    MenuItem menuItem = (MenuItem)sender;
    ContextMenu contextMenu = menuItem.Parent as ContextMenu;
    if (contextMenu != null)
    {
        ListViewItem listViewItem = contextMenu.PlacementTarget as ListViewItem;
        if (listViewItem != null)
        {
            object data = listViewItem.DataContext;
        }
    }
}
Другие вопросы по тегам