System.ArgumentException відбувається під час WindowsFormsHost, у WPF застосунку


Не знаєте, якщо це право виправити? Ми додали наші дампа пам'яті, діагностики , який може підтвердити цю проблему.

Причини


Ви створили Microsoft .NET 4.0 застосунок, який використовує WPF та WindowsFormsHost елемент, для розміщення елементів керування форм в ОС Windows. Під час використання програми, з'явиться таке виняток.

System.ArgumentException: Невидимий, або вимкнений елемент керування не можна активувати.
на System.Windows.Forms.ContainerControl.SetActiveControlInternal (елемент керування значення)
на System.Windows.Forms.ContainerControl.SetActiveControl (керування ctl)
на System.Windows.Forms.ContainerControl.set_ActiveControl (елемент керування значення)
на System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild()
на System.Windows.Forms.Control.InvokeMarshaledCallbackDo (ThreadMethodEntry ТЗН)
на System.Windows.Forms.Control.InvokeMarshaledCallbackHelper (об'єкт obj)
на System.Threading.ExecutionContext.runTryCode (об'єкт userData)
на System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, об'єкт userData)
на System.Threading.ExecutionContext.RunInternal (контекст контекст виконання, виконання, ContextCallback, зворотного виклику, об'єктів)
на System.Threading.ExecutionContext.Run (контекст контекст виконання, виконання, ContextCallback зворотного об'єктів, логічний вираз ignoreSyncCtx)
на System.Threading.ExecutionContext.Run (контекст контекст виконання, виконання, ContextCallback, зворотного виклику, об'єктів)
на System.Windows.Forms.Control.InvokeMarshaledCallback (ThreadMethodEntry ТЗН)
на System.Windows.Forms.Control.InvokeMarshaledCallbacks()


Причина


Це пов'язано з підтверджено помилку WPF, в .NET 4.0 Framework.

Вирішення


Можна вирішити цю проблему цими способами.

1. не програмним шляхом видалення елементів керування з WindowsFormsHost елементів. Замість цього приховати за їх видимих властивості.

2. дріт з-обробник подій System.Windows.Forms.Application.ThreadException події. Це дозволить заборона у діалоговому вікні Windows Forms виняток. Код можна перевірити, зокрема для того, щоб дізнатися, за винятком System.ArgumentException, з System.Windows.Forms, яке містить "System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild" у стеку для виклику. Якщо ні, то відобразять стандартний Windows Forms виняток діалогове вікно.


спільні MainWindow()
        {
System.Windows.Forms.Application.ThreadException-+ = новий System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        }

недійсним Application_ThreadException (об'єкт відправника, System.Threading.ThreadExceptionEventArgs e)
        {
If (!. FailureFromFocusedChild(e.Exception))
            {
System.Windows.Forms.Application.ThreadExceptionDialog сполучна;
сполучна = новий System.Windows.Forms.Application.ThreadExceptionDialog(e.Exception);
сполучна. ShowDialog();
            }

Приватна логічний FailureFromFocusedChild (Exception e)
        {
Логічний результат = false;
рядок stackTrace = e.StackTrace;
           
результат = (e-це System.ArgumentException) & & (e.Source =-= "System.Windows.Forms")
                    && (stackTrace.IndexOf("System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild")>=0);


Повертає результати;
        }

Додаткові відомості


WindowsFormsHost використовує процедуру для змінених вікна, відстеження WM_ACTIVATEAPP вікно повідомлення, щоб визначити, якщо хост-застосунок не активовано, або відключена.

Якщо хост-застосунок вимкнуто, потім WindowsFormsHost перевіряє, чи вікно з фокус вводу дочірнього вікна, WindowsFormsHost елемента. Якщо це так, то WindowsFormsHost кешує посилання на цей елемент керування, внутрішній до поля. WindowsFormsHost використовується це поле, щоб вибрати активний об'єкт після застосування, активації пізніше.

Якщо хост-застосунок активується, потім WindowsFormsHost перевіряє, чи внутрішній поля не null. Якщо це не null, асинхронно виконає System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild методом. Цей спосіб, буде встановлено Control.ActiveControl внутрішній поля, кешування раніше.

Проблема, коли цей елемент керування, які були кешованих було видалено з елементів WindowsFormsHost, після того, як його було відключено. Наприклад, це може статися, якщо застосування використовує WPF, Application.Deactivated подій, щоб заборонити WindowsFormsHost елемента керування.