2012年5月19日土曜日

wpf : AdornerにAssertを埋め込んだらVisual Studioごと落ちた

Adornerを継承したクラスを作りました。

public class TabMoveCursor : Adorner
{
    protected override int VisualChildrenCount
    {get{return _cursorCanvas == null ? 0 : 1;}}
    
    protected override Visual GetVisualChild(int index)
    {
        if (_cursorCanvas == null)
            throw new IndexOutOfRangeException("子要素はない");
        if (index != 0)
            throw new IndexOutOfRangeException("子要素は1つのみ");
        return _cursorCanvas;
    }

    ~色々略~

    private Canvas _cursorCanvas = null;

    protected override Size ArrangeOverride(Size finalSize)
    {
        Debug.Assert(_cursorCanvas != null);
        _cursorCanvas.Arrange(new Rect());

        return finalSize;
    }
}

このコードの_cursorCanvasは回りまわってどっかのクラスで依存プロパティから書き換えられるようにしました。 こんな感じで書き換えのテスト。

<appCtrls:TabControl x:Name="tabControl">
    <appCtrls:TabControl.MoveCursorCanvas>
        <Canvas>
            ~略~
        </Canvas>
    </appCtrls:TabControl.MoveCursorCanvas>
</appCtrls:TabControl>

MoveCursorCanvasの中身がAdornerの_cursorCanvasに入ります。 「ああ、動いたなぁ」ってことでVisual Studioのxamlデザイナ上でappCtrls:TabControl.MoveCursorCanvasを<!-- コメントアウト -->。 そうしたらAssertのダイアログが表示されてVisual Studio 2010 expressが落ちました。

そんなのアリですか?

まぁ、すぐ分かることなんでいいんですけどね。 そうかぁ、Visual Studio落ちるかぁ...

ちなみにArrangeOverrideメソッドはこんなコードに直しました。

protected override Size ArrangeOverride(Size finalSize)
{
    if(_cursorCanvas != null)
        _cursorCanvas.Arrange(new Rect());

    return finalSize;
}