【问题标题】:Overriding ApplicationCommands.Copy for editable WPF ComboBox覆盖可编辑 WPF 组合框的 ApplicationCommands.Copy
【发布时间】:2020-05-16 03:44:23
【问题描述】:

我在多个控件上覆盖 ApplicationCommands.Copy 并取得了成功,但无法弄清楚如何让它与 WPF 中的可编辑 ComboBox 一起工作。例如,TextBox 可以像这样正常工作:

 var copyCommandBinding = new CommandBinding(ApplicationCommands.Copy, CopyToClipboardExecuted);
 MyTextBox.CommandBindings.Add(copyCommandBinding); // Works as expected

当我尝试对可编辑的 ComboBox 执行相同操作时,它不起作用,即使我为 CanExcute 返回 true:

 var copyCommandBinding = new CommandBinding(ApplicationCommands.Copy, CopyToClipboardExecuted);
 MyComboBox.CommandBindings.Add(copyCommandBinding);  // Nothing happens

我通过添加一个 KeyUp 事件处理程序并测试 CTRL+C 来解决这个问题,这感觉不是正确的解决方案:

 public MyWindow()
 {
      MyComboBox.KeyUp += MyComboBox_KeyUp;
 }

 private void MyComboBox_KeyUp(object sender, KeyEventArgs e)
 {
      if (!Keyboard.IsKeyDown(Key.LeftCtrl) && !Keyboard.IsKeyDown(Key.RightCtrl)) return;
      if (e.Key == Key.C) CopyToClipboardExecuted();
 }

我确实知道在可编辑的 ComboBox 上添加 TextChanged 事件处理程序需要一些额外的工作来利用 TestBoxBase 的事件,所以我想知道是否有一些类似的技巧来获得对相同 TextBoxBase 的 ApplicationCommands.Copy 支持。我似乎找不到任何涵盖此细节的文档。

感谢任何猜测、帮助或提示,谢谢!

【问题讨论】:

    标签: c# wpf combobox copy-paste


    【解决方案1】:

    我的假设是正确的,多一点挖掘就得出了答案。为此,要访问 ComboBox 的 TextBoxBase,您必须使用 Template.FindName() 方法。 documentation 表明它可以作为“PART_EditableTextBox”找到。您还可以使用这个找到的参考在 TextBoxBase 上设置事件处理程序。唯一的问题是,您只能在呈现控件后这样做:

    private void MyWindow_ContentRendered(object sender, EventArgs e)
    {
        // Intercept Copy at Window
        CommandBinding copyCommandBinding = new CommandBinding(ApplicationCommands.Copy, CopyToClipboardExecuted);
        CommandBindings.Add(copyCommandBinding);
    
        // Intercept Copy within TextBox
        MyTextBox.CommandBindings.Add(copyCommandBinding);
    
        // Intercept Copy within ComboBox
        TextBox comboTextBox = MyTextBox.Template.FindName("PART_EditableTextBox", MyTextBox) as TextBox;
        comboTextBox.CommandBindings.Add(copyCommandBinding);
        comboTextBox.TextChanged += MyComboBox_TextChanged;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多