C# 失去焦点后在ElementHost的WPF RichTextBox中显示所选内容

C# 失去焦点后在ElementHost的WPF RichTextBox中显示所选内容,c#,wpf,focus,richtextbox,selection,C#,Wpf,Focus,Richtextbox,Selection,我目前正在开发一个带有WPF RichTextBox的windows窗体应用程序(基本上是一个文档编辑器)。当然,由于其余的都是windows窗体应用程序,我将WPF RichTextBox托管在ElementHost中 问题是我想让RichTextBox中的选择保持可见,即使它没有焦点。例如,我在工具栏中有几个文本格式按钮(粗体、斜体等),当我按下其中一个按钮时,我当前无法再看到所选内容,因为RichTextBox失去焦点 不幸的是,RichTextBox不像某些WinForms控件那样具有H

我目前正在开发一个带有WPF RichTextBox的windows窗体应用程序(基本上是一个文档编辑器)。当然,由于其余的都是windows窗体应用程序,我将WPF RichTextBox托管在ElementHost中

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

不幸的是,RichTextBox不像某些WinForms控件那样具有HideSelection属性

我已经尝试过取消LostFocus事件,如其他帖子所述。但是,当RichTextBox托管在ElementHost中时,这似乎不起作用(我尝试过,但它确实在仅WPF的项目中起作用)

我还尝试过在失去/获得焦点时设置/重置选择背景色,但这似乎非常粗糙,要使其可靠工作需要付出很多努力

有人知道如何实现这一目标吗

谢谢大家!

我找到了一个解决方案:

将第二个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控件中执行任何操作

仅起作用焦点设置为同一窗体的控件-如果直接从WPF RichTextBox离开父窗体,则会丢失选择突出显示。(LostFocus事件似乎未引发。)

编辑:
您可以从表单捕获停用事件,然后聚焦
yourRichTextBox
,然后聚焦
invisivleRichTextBox
。因此,您可以直接离开表单。

到目前为止,您的解决方案似乎运行良好。非常感谢你!