【问题标题】:WPF - Changing Focus from a RichTextBox causes a InvalidOperationExceptionWPF - 从 RichTextBox 更改焦点会导致 InvalidOperationException
【发布时间】:2018-06-06 14:30:34
【问题描述】:

当我必须从 RichTextBox 切换焦点时遇到一个奇怪的问题。我的应用程序的 xaml 如下:

<Window Name="MyWindow" x:Class="WpfBasics.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfBasics"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="400">
    <StackPanel>
        <TextBlock>Box 1:</TextBlock>
        <RichTextBox x:Name="Box1" TextChanged="Box1_TextChanged" />
        <TextBlock>Box 2:</TextBlock>
        <RichTextBox x:Name="Box2" />
    </StackPanel>
</Window>

使用以下代码隐藏(仅相关位):

private void Box1_TextChanged(object sender, TextChangedEventArgs e)
{
    Box2.Focus();
}

我使用Box1Focus 的那一刻抛出以下异常: System.InvalidOperationException: '无法在另一个单元已打开时重新打开撤消单元。'

查看 CallStack,我认为问题是由 RichTextBox 上的 LostFocus 事件处理程序引起的。

【问题讨论】:

  • 您想在立即输入文本框时更改焦点似乎很奇怪...
  • 为了简单起见,这个例子相当做作。我的用例是输入有效值后焦点应该改变的表单
  • 啊,我明白了。那么我提到的解决方法可以工作。如果输入了有效值,请在 TextChanged 事件中调用 ChangeFocus 方法。
  • 刚试了一下,问题依旧。当我查看调用堆栈时,是对 Undo_FlushPendingInputItems(TextEditor This) 的调用导致了问题。到目前为止,我最好的猜测是 RichTextBoxes 共享某种同时被访问的共享队列。

标签: c# wpf windows


【解决方案1】:

根据您提供的信息,我创建了一个似乎可行的示例项目。试一试:

private void Box1_TextChanged(object sender, TextChangedEventArgs e)
{
    RichTextBox textBox = sender as RichTextBox;
    var text = new TextRange(textBox.Document.ContentStart, textbox.Document.ContentEnd).Text;

    if (IsValid(text))
    {
        Dispatcher.BeginInvoke((Action)ChangeFocus);
    }
}

private void ChangeFocus()
{
    Box2.Focus();
}

private bool IsValid(string text)
{
    var plainText = text.Substring(0, text.Length - 2);

    if (plainText == "hello world")
        return true;

    return false;
}

【讨论】:

  • 谢谢!这非常适合我的情况。您对为什么分派变更焦点似乎可以避免该问题有任何见解吗? - 或者为什么这不是普通的TextBox 的问题?
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多