【问题标题】:How to catch keyboard events on an inline element in a WPF RichTextBox如何在 WPF RichTextBox 中的内联元素上捕获键盘事件
【发布时间】:2021-03-11 17:17:40
【问题描述】:

我需要在 Inline 元素 (System.Windows.Documents.Run) 上捕获键盘事件。在下面的示例中,所有鼠标事件都有效,但没有任何键盘事件。

为什么没有触发键盘事件?

private Run CreateWord(string text)
{
    var word = new Run(text);

    // Works as expected
    word.MouseDown += Word_MouseDown;
    word.MouseEnter += Word_MouseEnter;
    word.MouseLeave += Word_MouseLeave;

    // Does not work. No keyboard events are fired
    word.PreviewKeyUp += Word_KeyUp;
    word.KeyDown += Word_KeyDown;
    word.AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(delegate (object sender, KeyEventArgs e)
    {
        Debug.WriteLine("AddHandler KeyDown");
    }), true);

    return word;
}

private void Word_KeyDown(object sender, KeyEventArgs e)
{
    Debug.WriteLine("KeyDown");
}

private void Word_KeyUp(object sender, KeyEventArgs e)
{
    Debug.WriteLine("KeyUp");
}

【问题讨论】:

    标签: c# richtextbox keyboard-events flowdocument


    【解决方案1】:

    AddHandler 已经快到了。您只需要在RichTextBox 控件上调用AddHandler

    RichTextBox 正在处理KeyDown 事件,因此该事件没有到达您的Run

    这样的……

    private Run CreateWord(string text)
    {
        var word = new Run(text);
    
        // Works as expected
        word.MouseDown += Word_MouseDown;
        word.MouseEnter += Word_MouseEnter;
        word.MouseLeave += Word_MouseLeave;
    
        RichTextBox.AddHandler(KeyDownEvent, new KeyEventHandler(delegate (object sender, KeyEventArgs e)
        {
            Debug.WriteLine($"AddHandler KeyDown - {word.Text}");
        }), true);
    
        return word;
    }
    

    【讨论】:

    • 再测试一下我不确定这是否适合你。如果您开始编辑 RichTextBox 的内容,它可以将 Run 一分为二,原来的 run 将继续工作,但新的 run 不会附加处理程序。
    • 我认为Run 的拆分行为与RichTextBox 的不同语言设置和当前输入(OS)语言有关。我之前遇到过这个问题,但通过设置语言解决了这个问题。我还不能尝试你的解决方案,但它看起来很有希望。如果有效,我会将其标记为答案!
    • 对文本中的所有单词重复调用 CreateWord 函数。使用建议的解决方案,如果有 10 个单词,RichTextBoxKeyDown 事件将触发 10 次。另外,我在事件的参数中找不到原始的Run。我无法让这个解决方案发挥作用。
    猜你喜欢
    • 2016-07-14
    • 2012-03-09
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多