2

そのため、変更された項目に応答して UpdateLayout() を呼び出すコントロールがあります。これにより、次のようなスタック トレースが生成されます。

説明: アプリケーションは、System.Environment.FailFast(string メッセージ) を介してプロセスの終了を要求しました。メッセージ: 回復不能なシステム エラーです。スタック: System.Windows の MS.Internal.Invariant.Assert(Boolean, System.String) の MS.Internal.Invariant.FailFast(System.String, System.String) の System.Environment.FailFast(System.String) で。 System.Windows.UIElement.Measure(System.Windows.Size) で System.Windows.FrameworkElement.MeasureCore(System.Windows.Size) で System.Windows.Window.MeasureOverride(System.Windows.Size) で Window.GetWindowMinMax() System.Windows.ContextLayoutManager.UpdateLayout() で System.Windows.UIElement.UpdateLayout() で

明らかに、状況によっては、GetWindowMinMax() が何らかの Assert() に失敗し、Environment.FailFast の呼び出しが発生します。このエラーの発生を回避するために、UpdateLayout を呼び出す前にこれらの状況が発生しないことを確認するには、どのような条件を確認できますか?

4

2 に答える 2

2

これには一貫した再現があります:

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

非表示のウィンドウに RootVisual を設定すると、FailFast がトリガーされます。

于 2013-03-22T18:47:44.497 に答える
2

Reflector のコードを見てみましょうGetWindowMinMax。これはアサートです:

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

そのため、ウィンドウが実際には Win32 ウィンドウとしてまだ作成されていないか、その Win32 ウィンドウが既に破棄されているように見えます。

于 2012-05-25T15:41:41.437 に答える