Сбой приложения WPF (простое воспроизведение) - это Microsoft BUG? - PullRequest
2 голосов
/ 06 августа 2009

Проблема:

Наше приложение вылетает, когда пользователь вводит какой-то текст в текстовое поле WPF. Пожалуйста помоги! Легкое 3-минутное воспроизведение отображается ниже

Размножение:

  1. Зарегистрируйте событие TextChanged в WPF TextBox (m_textBox) для метода, приведенного ниже

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        // This line of code throws Unhandled exception when typing '^' char in 
        // the text box (in United "States-International" keyboard)
        m_textBox.Dispatcher.Invoke(DispatcherPriority.Normal, new SendOrPostCallback(Foo), null);
    }
    
    private void Foo(object state)
    {
        //Do nothing
    }
    
  2. Измените клавиатуру на "Соединенные Штаты - Международный"

  3. Запустите приложение и дважды введите '^' в TextBox

Приложение рухнет !!!!

Ответы [ 2 ]

1 голос
/ 17 ноября 2009

Проблема в том, что составной код не ожидает получения дополнительных входных событий, пока ваш обработчик TextChanged не вернется. Когда вы вызываете Dispatcher.Invoke, он вызывает обработку очереди сообщений Windows, вызывая дополнительные события ввода.

По моему мнению, это является ошибкой, поскольку механизм компоновки должен быть устойчивым к повторному входу при запуске пользовательских событий.

0 голосов
/ 06 августа 2009

Я мог бы воспроизвести эту ошибку. Ввод ^ q или ~~ также вызовет сбой. Исключение указывает, что композиция уже завершена. Мне удалось обойти это, используя асинхронный BeginInvoke вместо Invoke Будет ли это работать для вас?

m_textBox.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SendOrPostCallback(Foo), null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...