【发布时间】: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();
}
我使用Box1,Focus 的那一刻抛出以下异常:
System.InvalidOperationException: '无法在另一个单元已打开时重新打开撤消单元。'
查看 CallStack,我认为问题是由 RichTextBox 上的 LostFocus 事件处理程序引起的。
【问题讨论】:
-
您想在立即输入文本框时更改焦点似乎很奇怪...
-
为了简单起见,这个例子相当做作。我的用例是输入有效值后焦点应该改变的表单
-
啊,我明白了。那么我提到的解决方法可以工作。如果输入了有效值,请在
TextChanged事件中调用 ChangeFocus 方法。 -
刚试了一下,问题依旧。当我查看调用堆栈时,是对
Undo和_FlushPendingInputItems(TextEditor This)的调用导致了问题。到目前为止,我最好的猜测是 RichTextBoxes 共享某种同时被访问的共享队列。