2

true に設定されている場合に DependencyObject に装飾を追加するブール値の DependencyProperty を実装しています。DependencyProperty のデフォルト値を true にしたいのですが、そうすると PropertyChangedCallback が起動されないため、デフォルトではアドナーは作成されません。初期化時に PropertyChangedCallback を発生させる方法はありますか?

public static bool GetIsAdorned(DependencyObject obj)
{
    return (bool)obj.GetValue(IsAdornedProperty);
}

public static void SetIsAdorned(DependencyObject obj, bool value)
{
    obj.SetValue(IsAdornedProperty, value);
}

public static readonly DependencyProperty IsAdornedProperty =
       DependencyProperty.RegisterAttached("IsAdorned",
       typeof(bool),
       typeof(UIElement),
       new UIPropertyMetadata(true, OnIsAdornedChanged));

private static void OnIsAdornedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    var uiElement = dependencyObject as UIElement;
    var newValue = (bool)e.NewValue;
    var adornerLayer = AdornerLayer.GetAdornerLayer(uiElement);

    if (newValue)
    {
        adornerLayer.Add(new MyAdorner(uiElement));
    }
}
4

1 に答える 1

2

値の継承をサポートする添付プロパティを除き、ツリー内のすべての要素に自動的に適用される既定値はありません。

通常の添付プロパティ (継承なし) の値は、そのプロパティを明示的に設定しない限り、どの要素にも適用されません。プロパティが要素に明示的に設定されていない場合、添付プロパティの値を取得すると、メタデータから既定値が返されます。

たとえば、Canvas に設定なしの要素がある場合、Canvas はメタデータから 0 としてCanvas.Leftデフォルト値を取得します。Canvas.Left要素自体にはこの値がありません。

したがって、シナリオではとにかく適用するIsAdorned必要があるため、デフォルト値はfalse.

于 2012-04-23T16:00:06.893 に答える