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

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

推荐于2016-07-18 · 关注我不会让你失望
知道大有可为答主
回答量:8628
采纳率:47%
帮助的人:829万
展开全部
在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方法就可以了。
敢谢楼主分享
推荐于2016-03-11 · 超过17用户采纳过TA的回答
知道答主
回答量:54
采纳率:100%
帮助的人:41.6万
展开全部
wpf中使用Dispatcher类控制线程, 当异步操作完成后, 可以调用
Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => { //to do sth })); 返回UI线程
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
涂海凡95
2013-07-17 · TA获得超过227个赞
知道小有建树答主
回答量:239
采纳率:0%
帮助的人:73.3万
展开全部
窗体的控件是在主线程中的,也就是你一开始运行程序那个。WPF和其他.net规则里不允许跨线程调用,这被认为是不完全的。
一种是直接忽略所有的此类警告,Control.CheckForIllegalCrossThreadCalls = false;好像是这么写的,就是忽略所有的因跨线程产生的不安全警告。不过此方法不推荐。

第二种就是使用委托,具体例子百度有很多。
第三种是用winform的backgroundworker,不过WPF里把这个去掉了。加上的话虽然可以用,但是就会让WPF显得不伦不类。
总之推荐第二种
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
talencz
2013-07-16 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:139万
展开全部
线程中可以直接这样操作UI的?不需要用委托吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式