Wierd ввод / выход/проверка поведения в элементе управления WPF, размещенном в winform
Я работаю над приложением WinForms, которое частично переносится в WPF, так что существует смесь Winforms и WPF.
Проблема: На форму элемент управления WPF прошел через elementhost с, когда фокус переходит от победы формы текстовое поле в WPF контрол (скажем, текстовое поле), в Проверка событие текстового поля win forms вызывается таким образом, что проверка завершается неудачно (е.Отмена = истина), то вместо того, чтобы фокус был установлен на текстовое поле win forms, Входите, Выходите и Проверка событие продолжает многократно вызываться в текстовом поле WinForms. Обратите внимание, что я звоню Окно сообщения Winforms в событии проверки и если пользователь нажимает кнопку отмены, событие проверки устанавливается в значение отменено. В моем примере кода пользователь каждый раз нажимает кнопку Отмена, и в идеале фокус должен вернуться к исходному текстовому полю winforms.
Я попробовал следующее:
Что я уже пробовал:
Код выглядит следующим образом:
Приложения WinForms
private void WindowsFormTestLoad(object sender, EventArgs e) { // Host WPF UserControl in winforms UserControl1 ctrl = new UserControl1(); host = new ElementHost { Dock = DockStyle.Left , Child = ctrl}; this.panel1.Controls.Add(host); } // Textbox1 events private void TextBox1Enter(object sender, EventArgs e) { Debug.WriteLine("Enter: text box 1"); } private void TextBox1Leave(object sender, EventArgs e) { Debug.WriteLine("Leave: text box 1"); } // Show a message box with OK and Cancel buttons. // Clicking on Cancel simulates a validation failure (This is what happens in my application). private void TextBox1Validating(object sender, CancelEventArgs e) { Debug.WriteLine("Validating: text box 1"); var dialog = System.Windows.Forms.MessageBox.Show("blah blah", "caption", MessageBoxButtons.OKCancel); if (dialog == DialogResult.Cancel) { e.Cancel = true; } }
Управление WPF
<UserControl x:Class="WpfWinformInterop.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <StackPanel> <TextBox Name="txt1"></TextBox> </StackPanel>
Когда я пытаюсь переключить фокус на элемент управления Winform (скажем, текстовое поле), событие проверки срабатывает только один раз, и фокус возвращается к исходному текстовому полю.
Вывод отладки при переключении на текстовое поле win forms (текстовое поле 1 - текстовое поле 2) : Оставить: текстовое поле 1
Проверка: текстовое поле 1
Введите: текстовое поле 1
Когда я пытаюсь переместить фокус с формы win на WPF, событие проверки в текстовом поле формы win продолжает срабатывать.
Выход отладки при переключении на элемент управления WPF:
Оставить: текстовое поле 1
Проверка: текстовое поле 1
Введите: текстовое поле 1
Оставить: текстовое поле 1
Проверка: текстовое поле 1
Введите: текстовое поле 1
Оставить: текстовое поле 1
Проверка: текстовое поле 1
можно продолжать и дальше ...
Я не понимаю, почему поведение WPF отличается и что можно сделать, чтобы заставить его вести себя аналогично версии win forms. Любая помощь будет очень признательна.