在WPF 应用程序下出现:Invisible or disabled control cannot be activated(不见的或禁用的控件不能被激活)错误。
System.ArgumentException: Invisible or disabled control cannot be activated
at System.Windows.Forms.ContainerControl.SetActiveControlInternal(Control value)
at System.Windows.Forms.ContainerControl.SetActiveControl(Control ctl)
at System.Windows.Forms.ContainerControl.set_ActiveControl(Control value)
at System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild()
at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
解决办法:
该错误是线程的问题,对程序运行无影响,可以考虑过滤该错误。
方法如下:
1 确保删除的控件不是不见的或禁用的控件。
2 过滤该错误方法。
public MainWindow()
{
System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
}
void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
if (!FailureFromFocusedChild(e.Exception))
{
System.Windows.Forms.Application.ThreadExceptionDialog dlg;
dlg = new System.Windows.Forms.Application.ThreadExceptionDialog(e.Exception);
dlg.ShowDialog();
}
private bool FailureFromFocusedChild(Exception e)
{
bool result = false;
string stackTrace = e.StackTrace;
result = (e is System.ArgumentException) && (e.Source == "System.Windows.Forms")
&& (stackTrace.IndexOf("System.Windows.Forms.Integration.WindowsFormsHost.RestoreFocusedChild")>=0);
return result;
}