1

重複の可能性:
C# キーワードの使用法 virtual+override と new

UserControl次の方法で Content プロパティを非表示にしようとしています。

public partial class Tile : UserControl
{
    public new object Content
    {
        get { ... }
        set { ... }
    }
}

しかし、UserControl のコンテンツを設定しても何もしません (ブレークポイントを設定すると、到達することはありません)。

<my:Tile Content="The content"/>

また

<my:Tile>The content</my:Tile>

なんで?どうすればこの問題を解決できますか?

4

2 に答える 2

1

問題は、実際の DependencyProperty を隠しているのではなく、DP の値を設定するために WPF が常に使用する場合とそうでない場合がある get/set アクセサーのみを隠していることです。WPF には、代わりに DependencyObject.GetValue/SetValue を直接呼び出す最適化があります。

代わりに「Content」という名前でオブジェクトに依存関係プロパティを作成し、get/set アクセサーを新しくすると、実行していることが機能するはずです。

public static readonly new DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(Tile));

public new object Content
{
    get { return this.GetValue(ContentProperty); }
    set { this.SetValue(ContentProperty, value); }
}

ただし、既に存在する content プロパティを使用するだけでなく、なぜこれを行う必要があるのか​​ わかりません。ここでフレームワークと戦っているように思えますが、あなたが望むことを行うためのより簡単な方法があります。

于 2012-10-20T21:00:51.890 に答える
0

独自の機能をプロパティにプラグインしたい場合、Contentおそらく探しているのはDependencyProperty.OverrideMetadata(). このようにして、派生クラスに独自のプロパティ変更ハンドラーを追加できます。次のようになります。

static Tile()
{
    ContentProperty.OverrideMetadata(typeof(Tile), new PropertyMetadata(null, OnContentChanged));
}

private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // Your logic goes here.
}

編集

見てみると、WPF が既にこれを処理してくれました。単純にオーバーライドできますOnContentChanged

protected override void OnContentChanged(object oldContent, object newContent)
{
    base.OnContentChanged(oldContent, newContent);

    // Your logic goes here.
}
于 2012-10-20T21:03:54.663 に答える