前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >WPF如何在子线程或其他类中操控控件

WPF如何在子线程或其他类中操控控件

作者头像
zls365
发布2021-03-16 16:17:20
发布2021-03-16 16:17:20
2K00
代码可运行
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
运行总次数:0
代码可运行

问题

一开始使用WPF界面的时候,会有这样的需求就是在后台更新控件,以完成列表更新,计时器,进度条等功能,但WPF这边架构限制,决定子线程是不安全的,如果创建子线程直接操作控件就会出错。

解决

首先可以说明,这里只要使用Dispatcher类来操作就可以了,使用Involke函数,后者提供一个简单的匿名方法,用于委托主线程更新控件。

例子

我建立有一个类,这一个类中有两个函数,一个是RegistTextbox()用于在调用类时候,将主界面的空间传给它,另一个是AddMessageToTextbox()用于将字符串添加到文本框控件,他们的实现很简单

代码语言:javascript
代码运行次数:0
复制


public void RegistTextbox(TextBox tb)
        {
            MsgTextbox = tb;
        }
        public void AddMessageToTextbox(string str)
        {
            Dispatcher.CurrentDispatcher.Invoke(new Action(delegate
            {
                MsgTextbox.Text += str + "\r\n";
            }));
        }

这样就可以实现在子线程中控制控件的功能。

要访问其他WPF表单中的控件,您必须将该控件声明为公共控件。WPF中控件的默认声明是公共的,但是您可以使用以下代码指定它:

代码语言:javascript
代码运行次数:0
复制
< TextBox x:Name = " textBox1" x:FieldModifier =" public" /> 
 

之后,您可以在应用程序的所有活动窗口中搜索以找到具有此类控制功能的窗口:

代码语言:javascript
代码运行次数:0
复制
 foreach(Application.Current.Windows中的窗口)
 {
 if(window.GetType ()== typeof(Window1))
 {
(窗口为Window1).textBox1.Text ="我从另一个窗口更改了它";
} 
} 
  

实例:C#通过事件跨类调用WPF主窗口中的控件

xaml.cs文件:

代码语言:javascript
代码运行次数:0
复制
using System;
using System.Timers;
using System.Windows;
using System.Windows.Forms;
namespace ControlUsed
{
     //要修改控件的属性 只能在定义控件的xaml或者xaml对应的cs文件修改。首先订阅Monitor的PartEvent事件,当触发PartEvent事件时(可能并不在类MainWindow对象中),被注册的函数就行做出相应的响应。
    public partial class MainWindow
     {
        public MainWindow()
        {
              Monitor.PartEvent += OnStep;//将该类中的函数注册到Monitor静态类的PartEvent事件中。
        }
        public  void OnStep(Object sender,MessageArgs message)
        {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    MyTextBlock.Text = message.Txtmessage;//设置对应xaml中控件的属性
                }));
        }
     }
}

MessageArgs类:

代码语言:javascript
代码运行次数:0
复制
public  class MessageArgs:EventArgs
     {
       public MessageArgs(string message)
       {
           this.TxtMessage = message;
       }
       public string TxtMessage { get; set; }
     }

  Monitor静态类:

   public static class Monitor
    {
      public static event  EventHandler<MessageArgs> PartEvent;//定义在Monitor中的一个事件,参数是MessageArgs对象
      
      public static void InFunction(string message)
       {
           var messageArg = new MessageArgs
               {
                   TxtMessage=message
               };
           if (PartEvent != null)//如果mainwindow构造函数中给PartEvent注册了函数就不为null
           {
               PartEvent(null, messageArg);//触发事件,执行所有注册过的函数
           }
       }
      public static bool MonitorCenter(string s)
       {
         InFunction(s);//在外部类中修改TextBlock的Text
       }
   }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档