0

次のように定義された依存関係プロパティの例があります。

public Polyline Shape
{
    get { return (Polyline)GetValue(ShapeProperty); }
    set { SetValue(ShapeProperty, value); }
}

public static readonly DependencyProperty ShapeProperty =
DependencyProperty.Register("Shape", typeof(Polyline), 
typeof(CustomControl), new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender, onShapeAdded));

私はそれを次のように設定しています:

<local:CustomControl>
    <local:CustomControl.Shape>
        <Polyline Points="0,180 0,80 70,80 90,180 0,180" />
    </local:CustomControl.Shape>
</local:CustomControl>

コールバックは次のようになります。

private static void onShapeAdded(DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    Polyline control = (Polyline)e.NewValue;
    //control.Points is always null
}

コールバック中にPointsコレクションが常にnullになるのはなぜですか?(すべてのプロパティで発生します)最後にポイントが設定されているので、コントロールにアクセスするのが早すぎると思いますが、すべてのプロパティが設定された状態でいつ、どのようにコントロールにアクセスする必要がありますか?

4

1 に答える 1

0

メソッドonShapeAddedは、実際にはwhenのイベントハンドラーでありPropertyChangedCallback、Shapeプロパティが変更されたときに起動することを意味します。Polylineこの変更は、が追加されたとき、およびPointsプロパティが初期化される前に明らかに発生しています。

これを回避するには、をリソースとして定義しPolylineます。つまり、コントロールに追加される前に初期化されます。例えば:

<Window.Resources>
    <Polyline x:Key="myPolyline" Points="0,180 0,80 70,80 90,180 0,180" />
</Window.Resources>

<local:CustomControl Shape="{DynamicResource myPolyline}"/>

Polylineこのように追加すれば、は完全に初期化されると思います。

于 2013-03-12T22:11:27.003 に答える