Как найти элемент в списке просмотра 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;
}
}
}