最近工做,編寫wpf程序,遇到這樣一個問題:打開一個子窗口(稱爲formChild,當前窗口稱爲formParent),並向其傳送一個canvas控件(不僅是canvas控件其餘同理)。canvas
解決方法00:在formChild中新建一個canvas對象,在formParent中建立該formChild的實例,並formChild.canvas = this(formParent).canvas;而後調用formChild.ShowDialog();函數
結果:formChild中並無顯示canvas;解決方法00 pass;this
分析:(當時的分析,並不是正確) formChild在formParent中實例化得那一刻,就調用了InitializeComponent();因此不可能顯示;orm
解決方法01:在方法00的基礎上,在formChild構造函數中添加loaded的事件,同時在formChild的.cs文件中建立私有字段canvas01,formParent在實例化formChild後,執行對象
formChild.Canvas01 = this(formParent).canvas;事件
並在formChild的loaded的綁定事件中執行:this.Children.Add(canvas01);string
結果:報錯,當前控件已有parent,不能重新賦值parent。(大意是如此)it
分析:因爲用「=」對formChild.Canvas01賦值,因此canvas01拿到的是formParent.canvas的引用。而formParent.canvas的parent是存在的,及formParent上的某個grid或者window。由此也就明白瞭解決方法00中的分析是錯誤的,真正緣由是這一個。form
解決方法02:經由解決方法01的失敗,明白了問題的根結,因此問題轉變爲,如何在新窗體上去除傳入窗口的控件的parent。在解決方法02的基礎上,從formParent處向formChild傳入formChild.canvas01的parent控件parentControl。經過parentControl.Children.Remove(formChild.canvas01);基礎
結果:formChild成功顯示了從formParent傳來的canvas;可是當關閉formChild回到formParent後,formParent中canvas消失了。
分析:因爲在formChild中調用了parentControl.Children.Remove(formChild.canvas01);因此formParent中已經沒有canvas控件對象了。
解決方法03(最終解決方法):經由解決方法02,引起了一個問題,我如何拷貝控件,而不是隻拿到控件的引用。這個時候序列化,反序列化就上線了。經過System.Windows.MarkUp.XamlWriter和System.Windows.Markup.XamlReader,來實現控件的拷貝。這兩個是靜態類,咱們直接調用其方法。由此實現了控件canvas的拷貝,而後把拷貝後的canvas傳入formChild。因爲是拷貝,因此其parent會是null。
結果:成功顯示,而且解決方法02中引起的問題沒有發生。
拷貝代碼示例:string str = System.Windows.Markup.XamlWriter.Save(canvas1); pt.C = System.Windows.Markup.XamlReader.Parse(str) as Canvas;