1

次の依存関係プロパティを持つキャンバスを継承するクラスがあります

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

4

2 に答える 2

2

Polygon.PointsそれはPointCollectionであるため、そのイベントをサブスクライブしてから、@dowhilefor の提案に従って呼び出すことができますChangedInvalidateVisual()

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、変更された個人が解雇されます。StorageInvalidateVisual()

Changedコンセプトは、 のイベントをサブスクライブすることですPointsCollection。それがあなたにとって正しいことであるかどうかは、要件と論理に基づいて自分で対処する必要がある問題です。

于 2013-07-10T09:44:54.817 に答える
0

Affects render meta data オプションを使用して依存関係プロパティを登録します。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadata.affectsrender.aspx

于 2013-07-10T09:12:45.947 に答える