右键单击并复制 c# WPF 数据网格上的内容菜单
本文关键字:网格 菜单 数据网 数据 单击 复制 WPF 右键 | 更新日期: 2023-09-27 17:56:26
所以我有一个每行大约有 8 个单元格的 WPF 数据网格,为了简单起见,我只包含相关的一个,但我希望用户能够右键单击此单元格并将内容复制到 Windows 剪贴板中,而无需左键单击并先选择它。我已经尝试了许多代码片段,但似乎无法正常工作。每一行都是一个绑定项。
我一直在尝试的大多数事情都是使用MouseRightButtonDown事件。有些人尝试了XY位置,有些人使用e.OriginalSource作为FrameworkElement,但我似乎无法获得任何工作。不确定是否是因为它是一个 DataGrid超链接列,而不是示例中使用的其他类型?
我是 c# n00b!任何帮助将不胜感激。
<DataGrid x:Name="eventsDataGrid" AutoGenerateColumns="False" IsReadOnly="true" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="10,143,0,0" VerticalAlignment="Top" Height="295" CanUserAddRows="False" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserSortColumns="False" BorderThickness="1" HorizontalScrollBarVisibility="Disabled" FontSize="10" Width="1003" MouseRightButtonDown="eventsDataGrid_MouseRightButtonDown">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Copy URL" Click="CopyURL">
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns>
<DataGridHyperlinkColumn Width="230" Header="URL" Binding="{Binding URL}" CanUserResize="False">
<DataGridHyperlinkColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ToolTip" Value="URL of website" />
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</DataGridHyperlinkColumn.HeaderStyle>
<DataGridHyperlinkColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Foreground" Value="Black" />
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="FontSize" Value="12"/>
</Style>
</DataGridHyperlinkColumn.CellStyle>
</DataGridHyperlinkColumn>
</DataGrid.Columns>
</DataGrid>
下面的示例
演示如何使用单个上下文菜单作为多个目标元素的资源。请注意,创建自定义命令而不是"借用"ApplicationCommands.Copy
进行演示可能是个好主意,就像我在这里所做的那样。
<Window x:Class="WpfApplication2.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"
Loaded="Window_Loaded">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Copy"
Executed="CopyCommand_Executed"
CanExecute="CopyCommand_CanExecute"/>
</Window.CommandBindings>
<Window.Resources>
<ContextMenu x:Key="ctMenu" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
<MenuItem Header="Copy URL"
Command="ApplicationCommands.Copy"
CommandTarget="{Binding}"
CommandParameter="{Binding Text}"/>
</ContextMenu>
</Window.Resources>
<StackPanel>
<TextBlock Text="123" ContextMenu="{StaticResource ctMenu}"/>
<TextBlock Text="456" ContextMenu="{StaticResource ctMenu}"/>
</StackPanel>
</Window>
命令绑定还需要一些代码隐藏(自定义命令实现会有所不同)
private void CopyCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
Clipboard.SetText(e.Parameter as string);
}
private void CopyCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Parameter as string))
{
e.CanExecute = true;
e.Handled = true;
}
}