4

色、フォント、および手(Pathオブジェクトとして)を変更できるプロパティを持つカスタムClockFaceUserControlがあります。これは、カスタムTimePickerおよびClockUserControlsで使用されます。これらの親コントロールでは、ClockFaceプロパティをxamlのClockFaceオブジェクトに適切に設定できます。私がやろうとしているのは、これらのClockFaceプロパティを公開して、これら2つの親コントロール(ClockオブジェクトとTimePickerオブジェクトなど)に設定できるようにすることです。それらをアタッチプロパティにすることでうまくいくと思ったので、カラープロパティの1つを試してみました。

public static readonly DependencyProperty HourTicksBrushProperty = DependencyProperty.RegisterAttached("HourTicksBrush", typeof(Brush), typeof(ClockFace), new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.AffectsRender));
public static void SetHourTicksBrush(DependencyObject element, Brush value)
{
    element.SetValue(HourTicksBrushProperty, value);
}
public static Brush GetHourTicksBrush(DependencyObject element)
{
    return (Brush)element.GetValue(HourTicksBrushProperty);
}

Clockが付いているxamlでこの添付プロパティを使用できます:(コントロールはxml名前空間です)

<Controls:Clock Controls:ClockFace.HourTicksBrush="Aqua" />

正常にコンパイルされますが、添付のHourTicksBrushPropertyのデフォルト値(Brushes.Black)が表示されますが、親のClockコントロール(Aqua)に設定された値は、上記のメソッドを起動したり、色を変更したりすることはありません。私は何かが足りないのですか?

明確にするために、親コントロールで上記のxamlを使用して、子ClockFaceコントロールのHourTicksBrushプロパティを設定できるようにしたいと思います。

どんな助けでも大歓迎です。

4

2 に答える 2

6

アタッチされたプロパティクラスのこれらの「get」メソッドと「set」メソッドは、実際には、独自のコードビハインドの便利なメソッドにすぎません。XAMLパーサーはこれらを無視し、element.SetValue自体を呼び出します。セッターに応答する場合は、プロパティ変更ハンドラーをFrameworkPropertyMetadata

public static readonly DependencyProperty HourTicksBrushProperty = DependencyProperty.RegisterAttached(
    "HourTicksBrush", 
    typeof(Brush), 
    typeof(ClockFace), 
    new FrameworkPropertyMetadata(
        Brushes.Black, 
        FrameworkPropertyMetadataOptions.AffectsRender,
        HourTicksBrushChanged));

public static void SetHourTicksBrush(DependencyObject element, Brush value)
{
    element.SetValue(HourTicksBrushProperty, value); //not always called
}
public static Brush GetHourTicksBrush(DependencyObject element)
{
    return (Brush)element.GetValue(HourTicksBrushProperty); //not always called
}
private static void HourTicksBrushChanged(DependencyObject sender, somethingsomethingArgs args){
    // do stuff with sender and args.NewValue here
}
于 2010-10-18T20:33:06.067 に答える
0

次のようなものを使用します。

public static readonly DependencyProperty HourTicksBrushProperty = DependencyProperty.RegisterAttached("HourTicksBrush", typeof(Brush), typeof(ClockFace), new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.AffectsRender));


public static Brush HourTicksBrush
{
    get { return (Brush)GetValue(HourTicksBrushProperty); }
    set { SetValue(HourTicksBrushProperty); }
}

XAMLでこのようなもの

<Controls:Clockface.HourTicks Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HourTicksBrush}/>

RelativeSource で TemplatedParent を使用するか Self を使用するかがわかりません

于 2010-10-17T18:36:15.087 に答える