WPF不同线程之间的控件的访问


  

    WPF不同线程之间的控件是不同访问的,为了能够访问其他线程之间的控件,需要用Dispatcher.Invoke执行一个新的活动即可。

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void SetNotes(string notes)
{
     if (Dispatcher.Thread != Thread.CurrentThread)
     {
         this.txtNote.Dispatcher.Invoke(new Action (() =>
         {
             this.txtNote.Text += notes;
             this.txtNote.Text += "\r" ;
             this.txtNote.ScrollToEnd();
         }));
     }
     else
     {
         this.txtNote.Text += notes;
         this.txtNote.Text += "\r" ;
         this.txtNote.ScrollToEnd();
     }
}

 WinForm中:

复制代码
private delegate void delegateCrossThread(string message);
        private void SetStatus(string message)
        {
            if (this.m_StatusLabel.InvokeRequired == true)
            {
                delegateCrossThread ct = new delegateCrossThread(SetStatus);
                this.Invoke(ct, new object[] { message });
            }
            else
            {
                this.m_StatusLabel.Text = message;
                this.m_StatusLabel.Refresh();
            }
        }
复制代码

3、异步打开窗口

复制代码
            Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
            newWindowThread.SetApartmentState(ApartmentState.STA);
            newWindowThread.Start(); 

  private void ThreadStartingPoint()
        {
            SurveyStatWindow surveyStatDialog = new SurveyStatWindow();
            if (m_StatDataTable != null)
            {
                surveyStatDialog.TimeData = m_StatDataTable;
                surveyStatDialog.Init();
            }
            surveyStatDialog.ShowDialog();
        }
复制代码

 4、全局异步调用

?
      Application.Current.Dispatcher.Invoke( new Action(() =>
      {
          AddText();
      }));
 
      this .Dispatcher.Invoke( new Action(() =>
      {
          AddText();
      }));
 
Application.Current.Dispatcher.Invoke( new Action( delegate { AddText();}));








WPF中窗口控件的跨线程调用

在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方法就可以了。其它的处理同上!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值