0

OnRender メソッドでカスタム グラフィックスを描画するデコレータを作成しました。グラフィックは、デコレータを含むオブジェクトの位置によって異なります。Style を介して Template プロパティを介してデコレータを設定します。問題は、デコレーターの OnRender メソッドが、テンプレートの適用時に一度だけ呼び出されることです。したがって、オブジェクトの位置を変更してそのオブジェクトで InvalidateVisual() を呼び出すと、デコレータは再レンダリングされません。

オブジェクトのテンプレートを null に設定してから、次のように同じテンプレートにリセットすることで、これを回避できました。

if (myObject.Template != null)
{
  ControlTemplate tmpTemplate = myObject.Template;
  myObject.Template = null;
  myObject.Template = tmpTemplate;
}

これはうまくいきますが、これは行うべき方法ではないと確信しています。私は何が欠けていますか?

4

1 に答える 1

0

間違ったビジュアルを無効にしている可能性があると思います。デコレーター インスタンスを含むようにオブジェクト クラス内でグローバル変数を宣言し、装飾された要素の OnApplyTemplate メソッドをオーバーライドし、FindName メソッド呼び出しによってテンプレート内のデコレーター インスタンスでグローバル変数をワイヤリングしてみてください。myDecorator = Template.FindName("PART_decorator", this) as MyDecoratorType (この場合、xaml テンプレートのデコレータには x:Name が "PART_decorator" として定義されている必要があることに注意してください)。

その後、コード内の適切な場所でデコレータ インスタンスに対して InvalidateVisual() を呼び出すことができます。

于 2009-03-30T15:01:46.077 に答える