3

OnRenderメソッドをオーバーライドしたカスタム コントロールがあります。依存関係プロパティの変更イベントに対する制御を無効にしたいと考えています。また、親型のプロパティが変更されたときに更新するとよいでしょう。組み込み機能でこれを行う方法はありますか?

編集:

依存関係プロパティに「affect render」を使用し、追加情報またはプライベート プロパティがある場合は OnLayoutUpdated をチェックできることがわかりました。

FrameworkPropertyMetadata.AffectsRender

と:

private void OnLayoutUpdated(object sender, EventArgs e)
    {
        int result = (CornerRadius != null ? CornerRadius.GetHashCode() : 0);
        result = (result * PrimeHashNumber) ^ (IsSelected.GetHashCode());
        result = (result * PrimeHashNumber) ^ (IsReadCornerRadiusFromConfig.GetHashCode());
        result = (result * PrimeHashNumber) ^ (IsReadBorderThicknessFromConfig.GetHashCode());
        result = (result * PrimeHashNumber) ^ (SelectedColor!=null?SelectedColor.GetHashCode():0);
        result = (result * PrimeHashNumber) ^ (Background != null ? Background.GetHashCode() : 0);
        result = (result * PrimeHashNumber) ^ (BorderBrush != null ? BorderBrush.GetHashCode() : 0);
        
        if (lastHash != result)
        {
            this.InvalidateVisual();
            lastHash = result;
        }
    }
4

3 に答える 3

3

最良のアプローチは、使用する DependencyProperties で、それらがレンダリングに影響することを指定することです。

FrameworkPropertyMetadata.AffectsRender を参照してください: http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadata.aspx

于 2013-03-28T15:47:07.670 に答える
2

もちろん、最も速いのは、汚れた方法でこれを行うことです

(DataContext as INotifyPropertyChanged).PropertyChanged += OnPropertiesChanged

private void OnPropertiesChanged(sender, args)
{
    InvalidateVisual();
}

しかし、そのようなことをしないことを強くお勧めします。一方、私見のはるかに優れたソリューションは少し制限されています。依存関係プロパティを作成するときにAffectsRenderフラグを指定できるように、レンダリングに関連するようにカスタム依存関係プロパティを変更してみてください。「親タイプのプロパティ」と言っているのですが、その部分はわかりませんが、子ビューモデルを持つ親ビューモデルを意味していると思います。それに応じてプロパティを設計する場合、これは問題になりません。何らかの理由でその解決策が機能しない場合は、ビュー モデルで 1 つのプロパティのみを使用し、ビューで AffectsRender フラグを使用して依存関係プロパティにバインドし、ビューを再描画する必要があるときにビュー モデル ロジックに設定するだけで済みますが、繰り返しますが、これは汚い方法です。

また、OnRender メソッドで多くの描画を行うことにあまり誘惑されないでください。大規模なアプリケーションで WPF を使用しており、OnRender を使用している場所がおそらく 1 つか 2 つあり、それ以外はすべてスタイルとテンプレートで実現されています。

于 2013-03-28T15:47:00.510 に答える