System.ArgumentException se produce con WindowsFormsHost en aplicación de WPF

¿No está seguro de si se trata de la solución correcta? Hemos agregado a nuestro que puede confirmar este problema.

Síntomas

Ha desarrollado una aplicación de Microsoft .NET 4.0 que usa WPF y el elemento WindowsFormsHost para hospedar controles de formularios Windows Forms. Cuando se utiliza la aplicación, recibirá la siguiente excepción.

System.ArgumentException: Invisible o no se puede activar el control deshabilitado
en System.Windows.Forms.ContainerControl.SetActiveControlInternal (valor de Control)
en System.Windows.Forms.ContainerControl.SetActiveControl (Control ctl)
en System.Windows.Forms.ContainerControl.set_ActiveControl (valor de Control)
en System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild()
en System.Windows.Forms.Control.InvokeMarshaledCallbackDo (tme ThreadMethodEntry)
en System.Windows.Forms.Control.InvokeMarshaledCallbackHelper (Object obj)
en System.Threading.ExecutionContext.runTryCode (objeto userData)
en System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (código TryCode, CleanupCode backoutCode, userData del objeto)
en System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, devolución de llamada ContextCallback, estado de objeto)
en System.Threading.ExecutionContext.Run (ExecutionContext executionContext, devolución de llamada ContextCallback, estado del objeto, Boolean ignoreSyncCtx)
en System.Threading.ExecutionContext.Run (ExecutionContext executionContext, devolución de llamada ContextCallback, estado de objeto)
en System.Windows.Forms.Control.InvokeMarshaledCallback (tme ThreadMethodEntry)
en System.Windows.Forms.Control.InvokeMarshaledCallbacks()


Causa

Esto es debido a un error confirmado de WPF en .NET Framework 4.0.

Solución

Puede evitar este comportamiento en estas formas.

1. no quite controles mediante programación del elemento WindowsFormsHost. En su lugar, ocultarlas estableciendo su propiedad Visible.

2. alambre eventhandler para el evento System.Windows.Forms.Application.ThreadException. Esto le permitirá suprimir el cuadro de diálogo de excepción de formularios Windows Forms. El código puede comprobar específicamente si la excepción es una excepción System.ArgumentException de System.Windows.Forms, que contiene "System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild" en la pila de llamadas. Si no es así, a continuación, muestre el cuadro de diálogo de excepción estándar de formularios Windows Forms.


MainWindow() público
        {
System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        }

void Application_ThreadException (remitente de objeto, System.Threading.ThreadExceptionEventArgs e)
        {
If (!) FailureFromFocusedChild(e.Exception))
            {
Dlg System.Windows.Forms.Application.ThreadExceptionDialog;
Dlg = new System.Windows.Forms.Application.ThreadExceptionDialog(e.Exception);
Dlg. ShowDialog();
            }

private bool FailureFromFocusedChild (Exception e)
        {
BOOL resultado = false;
stackTrace de cadena = e.StackTrace;
           
resultado = (e es System.ArgumentException) & & (e.Source == "System.Windows.Forms")
                    && (stackTrace.IndexOf("System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild")>=0);


devolver el resultado;
        }

Más información

WindowsFormsHost utiliza un procedimiento de ventana reemplazado para supervisar WM_ACTIVATEAPP para mensajes de ventana para determinar si la aplicación host se está activando o desactivando.

Si se ha desactivado la aplicación host, WindowsFormsHost se comprueba para ver si la ventana con el foco de entrada es una ventana secundaria del elemento WindowsFormsHost. Si es así, WindowsFormsHost almacena en caché una referencia a ese Control dentro de un campo interno. WindowsFormsHost utilizará este campo para establecer como control activo una vez que se activa la aplicación en un momento posterior.

Si se activa la aplicación host, WindowsFormsHost se comprueba para ver si ese campo interno no es null. Si es distinto de null, el método System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild se ejecutan asincrónicamente. Este método establece Control.ActiveControl en el campo interno almacenado previamente.

El problema se produce cuando se ha quitado el Control que había en caché del elemento WindowsFormsHost después de la aplicación se ha desactivado. Por ejemplo, esto puede ocurrir si la aplicación utiliza el evento Application.Deactivated WPF para quitar controles del elemento WindowsFormsHost.

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¡Gracias por sus comentarios!

Gracias por sus comentarios. Quizá le interese ponerse en contacto con uno de nuestros agentes de soporte de Office.

×