3

MeasureOverrideメソッドをオーバーライドするWrapPanelから派生したクラスがあります。私は自分のアプリのスケルトン/プロトタイプを作成しています。最初にビューモデルとビューを実行して、画面の流れなどの概念を取得し、他の人がデザインについてフィードバックを提供できるようにします。つまり、非常に軽量なアプリです。

特定のボタンをクリックしてから次の画面が表示されるまでに時間がかかることに気付いたので、アプリのプロファイルを作成しました(サンプリング)。スタートアップメソッドの隣にあるMeasureOverrideは、最も時間がかかった単一のメソッドでした。これは私のコードです:

public class GroupWrapPanel : WrapPanel
{
    public const double ItemSize = 120.0;

    protected override Size MeasureOverride(Size availableSize)
    {
        var numberOfRows = (availableSize.Height / ItemSize);
        var numberOfCols = (Children.Count / numberOfRows) + 1;

        var newSize = new Size(numberOfCols * ItemSize, availableSize.Height);

        return base.MeasureOverride(newSize);
    }
}

だから私はオーバーライド全体をコメントアウトしました、そして今それは速く実行されました-MeasureOverrideはほとんどの時間を費やしたメソッドのリストにありませんでした。基本クラスを呼び出すだけのオーバーライドを入れただけです。これで、MeasureOverrideが再び表示され、かなりの時間がかかりました。

私は何か間違ったことをしていますか?

4

1 に答える 1

1

これを提案している場合:

protected override Size MeasureOverride(Size availableSize)
{
    return base.MeasureOverride(newSize);
}

大幅な速度低下を引き起こしますが、それは非常にありそうにありません。その些細なオーバーライドの有無にかかわらず本当にプロファイリングし、異なる結果に気付いた場合、プロファイラーに「自分のコードのみ」または同様の設定がある可能性が最も高いと思います。WrapPanel.MeasureOverrideあなたが見ていたときのコストGroupWrapPanel.MeasureOverride

パネルの測定が実際にかなりの時間を費やしているかどうかは別の問題ですが、信じられます.呼び出しツリーを掘り下げて、どの呼び出しが貢献しているかを見つけることをお勧めします.

于 2013-03-09T10:47:28.833 に答える