Неверный дескриптор окна при закрытии WinForm, на котором размещен пользовательский элемент управления WPF, на котором размещен элемент управления Windows Forms - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть программа, созданная группой разных людей за много разных лет.Некоторые приложения написаны на Winforms, некоторые написаны на WPF.У меня есть пользовательский элемент управления WPF, который я использую в некоторых окнах (WPF), и я пытаюсь поместить его в одно из окон Winforms моей программы.У меня есть версия этого элемента управления как для WPF, так и для WinForms, WinForms очень сложная и несколько глючная по сравнению с моей новой версией WPF, поэтому я помещаю ее в старое окно WinForms.

Этот пользовательский контроль WPFвнутри него есть элемент управления WinForms, потому что я не могу найти нужную мне версию элемента управления WPF (hexbox).Внутри формы winforms я разместил ElementHost, на котором размещен этот UserControl (WPF).Это работает очень хорошо, пока я не закрою окно, когда я получаю Win32Exception, говоря InvalidWindowHandle.Там нет полезной трассировки стека.

Exceptionthrown

Когда я закрываю форму, я располагаю интерпретаторWPF, элемент-хост для него.При удалении интерпретатора WPF он, в свою очередь, располагает гексбокс и его WinFormHostedControl.

  • интерпретаторWPF: пользовательский контроль WPF
  • интерпретаторWPFElementHost: WinFormsElementHost
  • PathfindingEditor:размещает все это

Когда я закрываю PathfindingEditor, я избавляюсь от многих вещей, чтобы предотвратить утечку памяти.

(pathfindingeditor.cs)
private void PathfindingEditor_FormClosing(object sender, FormClosingEventArgs e)
        {
            //Nullify things to prevent memory leaks
            interpreterWPF.Dispose();
            interpreterWPFElementHost.Child = null;
            interpreterWPFElementHost.Dispose();
            ...
(interpreterwpf.xaml.cs)
public override void Dispose()
        {
            Interpreter_Hexbox = null;
            Interpreter_Hexbox_Host.Child.Dispose();
            Interpreter_Hexbox_Host.Dispose();
        }

Я не уверен, что еще делать на этом этапе.Новый элемент управления WPF, который заменяет элемент управления winforms, намного проще и гораздо менее глючит.Было бы здорово изменить старую форму на WPF, но я не нашел подходящей библиотеки для сложной задачи, которую она должна выполнять, и у размещенных элементов Winforms в WPF есть много недостатков, поэтому я не пойду дальше, чем hexbox.

Я прочитал о Dispatcher.InvokeShutdown (), но, похоже, это полностью отключило поток пользовательского интерфейса WPF.Я сомневаюсь, что это то, что я ищу.

...