在失去焦点后,在ElementHost的WPF RichTextBox中显示选择

本文关键字:RichTextBox 显示 选择 WPF ElementHost 失去 焦点 | 更新日期: 2023-09-27 18:02:47

我目前正在开发一个windows窗体应用程序(基本上是一个文档编辑器)与WPF RichTextBox。当然,因为所有其余的是一个windows窗体应用程序,我托管WPF RichTextBox在一个元素thost。

问题是,我想保持在RichTextBox可见的选择,即使它没有焦点。例如,我在工具栏中有几个文本格式按钮(粗体,斜体,…),当我按下其中一个时,我目前无法再看到选择,因为RichTextBox失去了焦点。

不幸的是,RichTextBox没有像一些WinForms控件那样的hidesselection属性。

我已经尝试取消LostFocus事件描述在其他帖子。然而,当RichTextBox在ElementHost内托管时,这似乎不起作用(我尝试过,它确实在仅wpf的项目中工作)。

当失去/获得焦点时,我也尝试了一点设置/重置选择背景颜色,但这看起来非常粗糙,要使其可靠地工作需要付出很多努力。

有谁知道这是如何实现的吗?

谢谢!

在失去焦点后,在ElementHost的WPF RichTextBox中显示选择

我找到了一个解决方案:

添加第二个RichTextBox到你的ElementHost(高度为0)。
在RichTextBox的LostFocus中这样做:

bool firstLost = true;
void yourRichTextBox_LostFocus(object sender, RoutedEventArgs e)
{
        e.Handled = true;
        if (firstLost)
        {
            yourRichTextBox.Focus();
            firstLost = false;
        }
        else
        {
            firstLost = true;
        }
        invisibleRichTextBox.Focus();
}

所以它得到焦点,给它不可见的RichTextBox(所以e.Handled = true;工作正确),然后你可以做任何你想在你的WinForms-controls

只在焦点被设置为同一窗体的控件时才起作用——如果您直接从WPF-RichTextBox中离开parentform,它将失去选择高亮。(LostFocus-Event似乎没有被触发。)

编辑:您可以从表单捕获deactivate -事件,然后聚焦yourRichTextBox,然后聚焦invisivleRichTextBox。所以你可以直接离开你的表单