WPF的用户控件怎么访问主窗体的控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF的用户控件怎么访问主窗体的控件相关的知识,希望对你有一定的参考价值。

参考技术A 我有一个用户控件,用户控件被动态加载到主窗体(frm_Manage)里。我想当用户控件被点击后就清空主窗体里Grid控件里的所有子控件。
private void lbl_MenuName_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)//frm_Manage为主窗体,Grid_MenuChildren为主窗体的一个控件
var frm = (this.Parent as frm_Manage);
frm.Grid_MenuChildren.Children.Clear();上面这样写的话会报错:frm为null。
------解决方案--------------------------------------------------------使用事件。
主窗口响应事件,把值传给控件。
------解决方案--------------------------------------------------------呃,你把UserControl放MainWindow里不就结了。
WPF的话更建议用数据驱动的思想设计程序。
------解决方案--------------------------------------------------------响应事件的方法比较简单。
用户控件定义好了,在主窗体里完全可以把用户控件当作一个按钮来用。
// #用户控件// 定义public event EventHandler click;
// 被点击时,传递点击事件给外部
if (null != click) click(null, null);// #主窗体// 用户控件的点击事件
userControl.click += (us, ue) => MessageBox.Show("用户控件被点击"); ;
------解决方案--------------------------------------------------------实在不行你就给usercontrol写个SetParent的方法 初始化的时候调用下 把父窗口传递进去 然后用就是了这样基本上可以解决你的问题 但是不是推荐的做法
参考技术B 在winform里用ParentForm很简单就能实现

wpf中 我新开一个线程添加控件到主窗体

wpf中 我新开一个线程添加控件到主窗体,thread t=new thread(insertControlToMain);
t.start();
在insertControlToMain方法中 有向主窗体添加控件的操作 , 会报错,, 不知道什么错误原因,
希望大神给出一个好一点的解决方法 因为考虑到下载数据 窗体会假死 我不想窗体假死 等下载完数据再加载到主窗体。。 谢谢

在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可。
在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常;
没有CheckForIllegalCrossThreadCalls 属性,可以
在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程;既然不允许直接访问,就告诉控件我们要干什么就好了。
方法如下:

private delegate void outputDelegate(string msg);

private void output(string msg)

this.txtMessage.Dispatcher.Invoke(new outputDelegate(outputAction), msg);


private void outputAction(string msg)

this.txtMessage.AppendText(msg);
this.txtMessage.AppendText("\n");


这里是要 输出一段字符串在TextBox中,只需要调用output方法就可以了。
参考技术A wpf中使用Dispatcher类控制线程, 当异步操作完成后, 可以调用
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => //to do sth )); 返回UI线程本回答被提问者采纳
参考技术B 窗体的控件是在主线程中的,也就是你一开始运行程序那个。WPF和其他.net规则里不允许跨线程调用,这被认为是不完全的。
一种是直接忽略所有的此类警告,Control.CheckForIllegalCrossThreadCalls = false;好像是这么写的,就是忽略所有的因跨线程产生的不安全警告。不过此方法不推荐。

第二种就是使用委托,具体例子百度有很多。
第三种是用winform的backgroundworker,不过WPF里把这个去掉了。加上的话虽然可以用,但是就会让WPF显得不伦不类。
总之推荐第二种
参考技术C 线程中可以直接这样操作UI的?不需要用委托吗?

以上是关于WPF的用户控件怎么访问主窗体的控件的主要内容,如果未能解决你的问题,请参考以下文章

wpf中 我新开一个线程添加控件到主窗体

winform 添加wpf 窗体怎么使用

wpf中 我新开一个线程添加控件到主窗体

WPF中窗体打开的位置怎么控制?

c# winform 如何取得用户控件中 的值

如何从 viewmodel 访问用户控件上的命令