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

原创
2016/09/23 12:07
阅读数 119

最近工作,编写wpf程序,遇到这样一个问题:打开一个子窗口(称为formChild,当前窗口称为formParent),并向其传送一个canvas控件(不只是canvas控件其他同理)。

解决方法00:在formChild中新建一个canvas对象,在formParent中创建该formChild的实例,并formChild.canvas = this(formParent).canvas;然后调用formChild.ShowDialog();

    结果:formChild中并没有显示canvas;解决方法00  pass;

    分析:(当时的分析,并非正确)  formChild在formParent中实例化得那一刻,就调用了InitializeComponent();所以不可能显示;

解决方法01:在方法00的基础上,在formChild构造函数中添加loaded的事件,同时在formChild的.cs文件中创建私有字段canvas01,formParent在实例化formChild后,执行

    formChild.Canvas01 = this(formParent).canvas;

并在formChild的loaded的绑定事件中执行:this.Children.Add(canvas01);

    结果:报错,当前控件已有parent,不能从新赋值parent。(大意是如此)

    分析:由于用“=”对formChild.Canvas01赋值,所以canvas01拿到的是formParent.canvas的引用。而formParent.canvas的parent是存在的,及formParent上的某个grid或者window。由此也就明白了解决方法00中的分析是错误的,真正原因是这一个。

解决方法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;

    

 

 

 

 

 

 

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部