2016-08-31 65 views
0

我有一些UserControl(一個標籤很少的網格)正在生成並添加到運行時的畫布。我已經爲UserControl和UserControl之間的每個UserControl和節點行(或連接器行)實施了拖放操作。清除畫布中的依賴屬性的UserControl

當我清除用戶控件與myCanvas.Children.Clear(),我的方法收到以下錯誤Node_LayoutUpdated()

enter image description here

這是我的用戶:

public partial class Foo : UserControl 
{ 
    public static readonly DependencyProperty AnchorPointProperty = 
      DependencyProperty.Register(
      "AnchorPoint", typeof(Point), typeof(Foo), 
       new FrameworkPropertyMetadata(new Point(0, 0), 
       FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    public Point AnchorPoint 
    { 
     get { return (Point)GetValue(AnchorPointProperty); } 
     set { SetValue(AnchorPointProperty, value); } 
    } 

    private Canvas mCanvas; 

    public Foo(Canvas canvas, bool isInput) 
    { 
     InitializeComponent(); 
     mCanvas = canvas; 
     this.LayoutUpdated += Node_LayoutUpdated; 
    } 

    void Node_LayoutUpdated(object sender, EventArgs e) 
    { 
     Size size = RenderSize; 
     Point ofs = new Point(size.Width/2, size.Height/2); 
     AnchorPoint = TransformToVisual(this.mCanvas).Transform(ofs); 
    } 
} 

我應該刪除UserControl之前刪除DependencyProperty,以及如何?有人可以解釋什麼原因導致這個錯誤信息,爲什麼?

回答

1

你的問題是你的代碼的最後一行。刪除(清除)畫布的子項後,將立即調用LayoutUpdated事件。如果控件已從VisualTree中分離,則TransformToVisual不起作用。訂閱父母佈局事件通常既不需要也不是一個好主意。一個快速的解決方法是將分開之前的控制Clear

將此代碼添加到您的用戶控件:

public void Detach() 
{  
    this.LayoutUpdated -= Node_LayoutUpdated; 
} 

這給你的主窗口:

foreach(WhateverYourControlTypeIs control in myCanvas.Children) 
{ 
    control.Detach(); 
} 
myCanvas.Children.Clear(); 
+0

因爲函數Node_LayoutUpdated駐留在用戶控件,我不能在MainWindows脫離它,我也得到「名稱Node_LayoutUpdated在當前上下文中不存在「。那我如何分離它呢? – KMC

+0

@KMC嗯,最簡單的方法是將代碼放入UserControl的公共方法中(例如,在您的UserControl中實現'IDisposable'接口,將分離代碼放在那裏),然後在刪除代碼之前手動調用它。當發生'InvalidOperationException'時,您也可以捕獲異常並分離事件。您可以使用VisualTreeHelper來查找控件的父級,而不是在構造函數中設置mCanvas。(http://stackoverflow.com/questions/636383/how-can-i-find-wpf-controls-by-name - 或 - 型)。 –

+0

抱歉,但我沒有關注你。什麼使Node_LayoutUpdated公開?這仍然無法在MainWindows中訪問 - 你是什麼意思手動調用它? – KMC