9

カスタム WPF コントロールは OnRender をオーバーライドします。このメソッドは、カスタム データからパスを生成して表示します。データ プロバイダーは、依存関係プロパティを使用してバインドされます。Dependency プロパティは、データが変更されたときにイベントを登録します。このイベントは、InvalidateVisual() を呼び出します。

ただし、InvalidateVisual() の後で OnRender が常に呼び出されるわけではありません。

Prism Framework と Region 機能を使用します。問題のコントロールはそのような領域に埋め込まれており、アクティブ化および非アクティブ化されています。ただし、コントロールのプロパティ「IsVisible」は、領域がアクティブなときはいつでも true です。それでも、InvalidateVisual() を呼び出すと、OnRender メソッドは呼び出されません...

OnRender メソッドが呼び出されない原因は何ですか?

4

3 に答える 3

2

私もこの問題を抱えていました。

環境

VirtualizingStackPanel (ListBox 内) 内の DynamicDataDisplay グラフ コンポーネントに基づくコントロールが多数あります。

一度に表示できるコントロールが他にもあるが、スクロール時に VirtualizingStackPanel がそれらを再利用するのに十分でない場合、D3 AxisControl クラスでこの問題が発生します。何らかの理由で、何かが変更されたときに InvalidateVisual を呼び出してトリガーしようとする OnRender メソッドで多くの作業を行います。

問題の場合、問題のコントロールは InvalidateVisual を呼び出しますが、MeasureOverride、ArrangeOverride、またはOnRender への呼び出しを取得しません。興味深いことに、ほとんどのコントロールはまだ機能します。ある特定の問題のケースでは、11 のセットのうち最後の 3 つが適切に機能しないことがあります。特に、これら 3 つ (および 3 つだけ) は、InvalidateVisual への呼び出しをトリガーするデータ バインディングの更新の直前に、MeasureOverride への呼び出しを受け取ります。

私の修正

最後に、InvalidateVisual への呼び出しと一緒に InvalidateMeasure への呼び出しを追加することで、なんとか修正できました。

これは恐ろしい解決策ですが、私たちのアプリケーションのパフォーマンスにとって重要な部分ではないので、うまくやっているようです。

于 2013-10-14T07:41:39.990 に答える