在 WPF DataGrid 中未检测到 CTRL + C

Posted

技术标签:

【中文标题】在 WPF DataGrid 中未检测到 CTRL + C【英文标题】:CTRL + C is not detected in WPF DataGrid 【发布时间】:2014-12-05 06:03:06 【问题描述】:

我有一个 WPF 应用程序,其中 MainWindow 类有 <Window.CommandBindings><Window.InputBindings> 所以我可以检测到 CTRL + X, CTRL + CCTRL + V 命令。

MainWindow 包含一个 DataGrid,我想在其中选择一行并使用 CTRL + C 命令复制该行中的数据。在 DataGrid 中选择一行时,在 MainWindow 中不再检测到 CTRL + C 命令。 CTRL + XCTRL + V 仍然被检测到。

我已经通过一个非常简单的例子重现了这个问题。只需复制并粘贴下面的代码,它应该可以随时编译和运行。然后执行以下操作:

    CTRL + XCTRL + CCTRL + V:弹出窗口会显示激活了什么命令。 在 DataGrid 中选择一行,然后按 CTRL + C:什么都不会发生。 CTRL + XCTRL + V 仍会被检测到。

MainWindow.XAML 代码

<!-- Commands for hot keys -->
<Window.CommandBindings>

    <!-- Source -->
    <!-- http://***.com/questions/4682915/defining-menuitem-shortcuts -->

    <CommandBinding Command="Cut" Executed="btnCut_Click" />
    <CommandBinding Command="Copy" Executed="btnCopy_Click" />
    <CommandBinding Command="Paste" Executed="btnPaste_Click" />

</Window.CommandBindings>

<!-- Hot keys -->
<Window.InputBindings>
    <KeyBinding Key="X" Modifiers="Control" Command="Cut" />
    <KeyBinding Key="C" Modifiers="Control" Command="Copy" />
    <KeyBinding Key="V" Modifiers="Control" Command="Paste" />
</Window.InputBindings>

<Grid>
    <DataGrid Name="dgPersons" HorizontalScrollBarVisibility="Auto" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Extended" GridLinesVisibility="None" Background="White" Margin="75,59,35,104">

        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="BorderThickness" Value="0" />
                <Setter Property="FocusVisualStyle" Value="x:Null" />
            </Style>
        </DataGrid.CellStyle>

        <DataGrid.Columns>

            <!-- Name -->
            <DataGridTextColumn Header="Name" Width="100" Binding="Binding Name, Mode=OneTime" />

        </DataGrid.Columns>
    </DataGrid>
</Grid>

MainWindow.cs 代码

public partial class MainWindow : Window

    ObservableCollection<Person> persons = new ObservableCollection<Person>();

    public MainWindow()
    
        InitializeComponent();

        Person person1 = new Person("Person1");
        Person person2 = new Person("Person2");
        Person person3 = new Person("Person3");

        persons.Add(person1);
        persons.Add(person2);
        persons.Add(person3);

        dgPersons.ItemsSource = persons;
    

    private void btnCut_Click(object sender, ExecutedRoutedEventArgs e)
    
        MessageBox.Show("CUT command activated");
    

    private void btnCopy_Click(object sender, ExecutedRoutedEventArgs e)
    
        MessageBox.Show("COPY command activated");
    

    private void btnPaste_Click(object sender, ExecutedRoutedEventArgs e)
    
        MessageBox.Show("PASTE command activated");
    


public class Person

    string name;

    public Person(string name)
    
        this.name = name;
    

    public string Name
    
        get  return name; 
    

当在 DataGrid 中选择一行时,如何使 CTRL + C 工作?

【问题讨论】:

1. ***.com/questions/832185/… 2. ***.com/questions/1361350/keyboard-shortcuts-in-wpf 关注此链接***.com/questions/13876874/… Ctr+CDataGrid 自己处理,有关创建行为的解决方法,请参阅this 问题。也许更容易使用控件不使用的热键,例如Alt+C 【参考方案1】:

我通过在 DataGrid 本身中包含命令和输入绑定来解决它:

<DataGrid>
    <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
    <DataGrid.CommandBindings>
        <CommandBinding Command="Copy" Executed="CopyCommand" />
    </DataGrid.CommandBindings>

    <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
    <DataGrid.InputBindings>
        <KeyBinding Key="C" Modifiers="Control" Command="Copy" />
    </DataGrid.InputBindings>
</DataGrid>

然后在代码中回调以处理来自 CTRL + C 的事件。

    /// <summary>
    /// Handle CTRL + C callback
    /// </summary>
    private void CopyCommand(object sender, ExecutedRoutedEventArgs e)
    
        // Do copy here
    

【讨论】:

***.com/questions/57283421/…【参考方案2】:

我遇到了同样的问题,找到了这篇文章,它对我帮助很大。对于遇到此问题的任何人,您可以不用 InputBinding 复制/Ctrl+C 部分。但是,如果您想执行此类操作,则需要 CommandBindingInputBinding 用于 Ctrl+A(通常为全选)。如果其他常用键组合也需要InputBindings,我不会感到惊讶。

不过,出于某种原因,Ctrl+X(剪切)在没有CommandBindingInputBinding 的情况下也可以。古怪。 WPF 中存在一些错误或至少是这样的不一致,Microsoft 从未着手修复。

在任何情况下,作为 WPF 中使用的命令语法模式的一部分,提到的事件处理程序始终是必需的,并且通常也应该有匹配的 CanExecuteCopyCommand(object sender, CanExecuteRoutedEventArgs e)

【讨论】:

以上是关于在 WPF DataGrid 中未检测到 CTRL + C的主要内容,如果未能解决你的问题,请参考以下文章

WPF datagrid/gridcontrol 中选中多行,复制粘贴到excel或其他文本编辑器中

WPF DataGrid,处理键和无数据

当 Datagrid 失去焦点时,WPF DataGridRow 自定义样式被解除

WPF DataGrid 使用CellTemplateSelector 时SelectTemplate方法Item参数为NULL

WPF 在datagrid模板列中添加用户控件,在后台如何快速的检索到该控件。急!!!

WPF DataGrid MultiBinding到DataGrid ItemSsource中的类