我有一个继承canvas的类,具有以下依赖属性
public class StorageCanvas : Canvas
{
public readonly static DependencyProperty StorageProperty = DependencyProperty.Register(
"Storage",
typeof(Polygon),
typeof(StorageCanvas));
public Polygon Storage
{
get { return (Polygon) GetValue(StorageProperty); }
set { SetValue(StorageProperty, value); }
}
}
当Storage
多边形Points
被更改/更新时,我可以以某种方式使依赖属性“更新”,而不是要求用新实例替换多边形吗?
答案 0 :(得分:2)
好Polygon.Points
是PointCollection,因此您可以订阅Changed
事件,然后按照@dowhilefor
InvalidateVisual()
public class StorageCanvas : Canvas {
public static readonly DependencyProperty StorageProperty = DependencyProperty.Register(
"Storage",
typeof(Polygon),
typeof(StorageCanvas),
new FrameworkPropertyMetadata(null, PropertyChangedCallback));
public Polygon Storage {
get {
return (Polygon)GetValue(StorageProperty);
}
set {
SetValue(StorageProperty, value);
}
}
private static void PropertyChangedCallback(
DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) {
var currentStorageCanvas = dependencyObject as StorageCanvas;
if (currentStorageCanvas == null)
return;
var oldPolygon = args.OldValue as Polygon;
if (oldPolygon != null)
oldPolygon.Points.Changed -= currentStorageCanvas.PointsOnChanged;
var newPolygon = args.NewValue as Polygon;
if (newPolygon == null)
return;
newPolygon.Points.Changed += currentStorageCanvas.PointsOnChanged;
// Just adding the following to test if updates are fine.
currentStorageCanvas.Children.Clear();
currentStorageCanvas.Children.Add(newPolygon);
}
private void PointsOnChanged(object sender, EventArgs eventArgs) {
InvalidateVisual();
}
}
现在,如果Point
中的任何个人Storage
发生了更改,而未实际重新创建整个对象,则InvalidateVisual()
将被解雇。
这个概念就是订阅Changed
PointsCollection
事件。是否为您做正确的事情是您需要根据自己的要求和逻辑来解决自己的问题。
答案 1 :(得分:0)
使用Affects render meta data选项注册依赖项属性。
http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadata.affectsrender.aspx