在什么情况下UIElement.UpdateLayout()可以调用Environment.FailFast?

时间:2012-05-25 15:26:28

标签: .net wpf error-handling

所以我有一个控件,响应它的项目被更改,调用UpdateLayout()。这会导致堆栈跟踪如下所示:

  

描述:应用程序请求进程终止   System.Environment.FailFast(字符串消息)。消息:无法恢复   系统错误。 Stack:at System.Environment.FailFast(System.String)   在MS.Internal.Invariant.FailFast(System.String,System.String)at   MS.Internal.Invariant.Assert(Boolean,System.String)at   System.Windows.Window.GetWindowMinMax()at   System.Windows.Window.MeasureOverride(System.Windows.Size)at   System.Windows.FrameworkElement.MeasureCore(System.Windows.Size)at   System.Windows.UIElement.Measure(System.Windows.Size)at   System.Windows.ContextLayoutManager.UpdateLayout()at   

中的System.Windows.UIElement.UpdateLayout()

显然,在某些情况下,GetWindowMinMax()会失败某种类型的Assert(),这会导致对Environment.FailFast的调用。在调用UpdateLayout之前我可以检查哪些条件以确保不会出现这些情况以避免遇到此错误?

2 个答案:

答案 0 :(得分:2)

选择Reflector并查看GetWindowMinMax的代码。这是断言:

Invariant.Assert (!this.IsCompositionTargetInvalid, 
    "IsCompositionTargetInvalid is supposed to be false here") ;

所以看起来你的窗口还没有真正创建为Win32窗口,或者它的Win32窗口已经被破坏了。

答案 1 :(得分:2)

我对此持有一致的责备:

        hwndSource = new System.Windows.Interop.HwndSource(p);
        this.Visibility = System.Windows.Visibility.Hidden;
        hwndSource.RootVisual = this;

将RootVisual设置为隐藏窗口将触发FailFast。