我有一个示例依赖属性定义如下:
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? (它发生在每个属性)最后点设置,所以我想我很快就会访问我的控件,但是何时以及如何使用它的所有属性设置来访问控件?
答案 0 :(得分:0)
onShapeAdded
方法实际上是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
我相信如果以这种方式添加,{{1}}将完全初始化。