WPF - изменение фокуса с RichTextBox вызывает InvalidOperationException - PullRequest
0 голосов
/ 06 июня 2018

Сталкивается со странной проблемой, когда мне приходится переключать фокус с 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 Я считаю, что проблема вызвана обработчиком события LostFocus на RichTextBox.

1 Ответ

0 голосов
/ 06 июня 2018

На основании предоставленной вами информации я создал пример проекта, который, похоже, работает.Дайте этому шанс:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...