wpf 窗体之间传递控件-01(未完)

最近工做,编写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;

相关文章
相关标签/搜索