右键单击并复制 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>

右键单击并复制 c# WPF 数据网格上的内容菜单

下面的示例

演示如何使用单个上下文菜单作为多个目标元素的资源。请注意,创建自定义命令而不是"借用"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;
    }
}