wpf:通过调度程序更新多个控件

2024-01-11

我正在使用 SerialPort 类中的事件侦听器从串行端口读取数据。在我的事件处理程序中,我需要使用通过串行端口传入的 xml 数据来更新窗口中的许多 (30-40) 控件。

我知道我必须使用 myControl.Dispatcher.Invoke() 来更新它,因为它位于不同的线程上,但是有没有办法一起更新大量控件,而不是为每个控件进行单独的 Invoke 调用(即 myCon1.Dispatcher. Invoke()、myCon2.Dispatcher.Invoke() 等)?

我正在寻找类似在容器上调用 Invoke 并单独更新每个子控件的方法,但我似乎无法弄清楚如何完成此操作。

Thanks!


你需要做的是使用MVVM http://msdn.microsoft.com/en-us/magazine/dd419663.aspx.

您将控件绑定到 ViewModel 上的公共属性。您的VM可以侦听串行端口,解析出xml数据,更新其公共属性,然后使用INotifyPropertyChanged http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx告诉 UI 更新其绑定。

我建议您采用此路线,因为您可以批量通知,并且如果必须的话,可以使用 Dispatcher 在 UI 线程上调用事件。

UI:

<Window ...>
  <Window.DataContext>
    <me:SerialWindowViewModel />
  </Window.DataContext>
  <Grid>
    <TextBlock Text="{Binding LatestXml}/>
  </Grid>
</Window>

串行窗口视图模型:

public class SerialWindowViewModel : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  public string LatestXml {get;set;}

  private SerialWatcher _serialWatcher;

  public SerialWindowViewModel()
  {
    _serialWatcher = new SerialWatcher();
    _serialWatcher.Incoming += IncomingData;
  }

  private void IncomingData(object sender, DataEventArgs args)
  {
    LatestXml = args.Data;
    OnPropertyChanged(new PropertyChangedEventArgs("LatestXml"));
  }

  OnPropertyChanged(PropertyChangedEventArgs args)
  {
    // tired of writing code; make this threadsafe and
    // ensure it fires on the UI thread or that it doesn't matter
    PropertyChanged(this, args);
  }
}

而且,如果这对您来说不可接受(并且您希望像 winforms 应用程序一样对 WPF 进行编程),您可以在手动更新表单上的所有控件时使用 Dispatcher.CurrentDispatcher 调用一次。但这个方法很臭。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wpf:通过调度程序更新多个控件 的相关文章

随机推荐

  • Xcode 数据模型编辑器未出现

    我正在使用 Xcode 4 2 并且正在尝试使用 Core Data 单击 xcdatamodeld 文件后 我看到一个奇怪的视图 而不是数据模型编辑器视图 我已经重新安装了 Xcode 4 2 甚至从头开始创建了一个启用 Core Dat
  • 如何删除 MASM 中未使用的 .CONST 数据?

    我在 MASM 中使用宏生成大约 2000 个函数 为每个函数定义一个字符串 但在任何给定程序中我只使用大约 30 个函数 无法提前预测我将使用哪些 我根据需要使用它们 有什么方法可以告诉链接器 删除 我最终没有使用的字符串吗 他们将二进制
  • 如何使用图像类型按钮删除 HTML 表单中提交时的 x 和 y?

    我在我的应用程序中创建了一个表单 如下所示
  • 免费矢量图标[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于基本桌面程序工具栏按钮 如后退 前进 打印 保存等 的免费矢量图标 例如 适合在使用 WPF
  • 在 JSON 键或值中使用双引号

    我想使用双引号 在我的 JSON 中 但它不起作用 这是我的 JSON I 1 Vehicle Con trol M D2 VM 3300 00 VSD 324 04 G 1 Ve hicle Control M N 1 http json
  • Java 日期解析“上午”和“下午”

    使用 SimpleDateFormat 如何解析字符串 2013 05 23T09 18 07 下午 380 0000 我所有的 SimpleDateFormat 字符串都在 p m part 提前致谢 编辑 我们无法控制传入的格式 我试过
  • 如何要求 Neo4j 考虑周期

    Neo4j 似乎故意省略了循环 因此查询如下 MATCH n1 R gt n2 lt R n1 RETURN n1 n2 除非存在两个类型关系 否则始终不返回任何内容R之间n1 and n2 这绝对是可能的 而且是一个糟糕的黑客 但我有一个
  • Oracle:从字符串中删除前 4 个字符

    所以我想从oracle中的字符串中删除前4个字符 这些角色每次都可能不同 就我而言 我需要去掉 IBAN 的前 4 个字符并将它们放在字符串的末尾 我得到了将它们放在字符串末尾的部分 但我无法删除前 4 个字符 我在互联网上找到的每个解决方
  • 我怎样才能安全地执行Python的子集?

    我需要在数据库中存储基本功能的源代码 并允许通过管理界面对其进行修改 这段代码将接受几个数字和字符串作为参数 并返回一个数字或None 我知道 eval 是邪恶的 所以我需要实现一种安全的方法来从基于 python 的网络应用程序中执行 p
  • Django 管理员,无法分组依据:异常值:“dict”对象没有属性“_meta”

    我有一个映射到 postgresql 视图的模型 class AppModel models Model nbr models BigIntegerField blank True null True region models Forei
  • 是否可以从 heroku 检索您的源代码?

    将源代码上传到 Heroku 后 如果需要 例如本地磁盘出现故障 是否可以从那里下载它 由于 Heroku 与 git 的集成 我认为这至少在理论上是可能的 只要去https dashboard heroku com apps YOUR A
  • JavaFX TableView 滚动

    我的 TableView 包含一些数字数据 当我说通过按钮编辑值时 它将单元格的背景更改为绿色 当没有足够的行使表可滚动时 这种方法很有效 一旦表格变得 或从一开始 可滚动 它就会开始表现得很奇怪 它会更改已编辑项目的背景 但它会更改在向下
  • 每次通过 3G 连接时 UDP 端口都会改变

    我正在使用基于java的UDP套接字与3G模块进行通信 但是收到的数据包的端口 有时是IP地址 每次都会改变 这是非常令人惊讶的 这表明我无法为3G模块分配固定的IP 端口并与其通信 而只能依靠传入的数据包来获取目的地信息 有人能告诉我为什
  • ASP.net core 中的 OData 支持

    既然版本 1 已经发布 那么 ASP net core 现在是否支持 oData 我进行了搜索 但我找不到任何这样或那样的说法 编辑 现在可以在https www nuget org packages Microsoft OData Cor
  • 获取 C 中的时区 GMT 偏移量

    我正在使用标准mktime http linux die net man 3 mktime函数来转动struct tm转化为纪元时间值 这tm字段在本地填充 我需要获取 GMT 的纪元时间 tm has a gmtoff字段允许您为此目的设
  • 1e-9 或 -1e9,哪一个是正确的? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我被分配了
  • 如何在 CMake 中构建具有 2 个不同变量值的程序

    我最近移植了我的Qt项目来自qmake to CMake 我的主程序包含一个值 该值取决于 define指示 我想通过外部指定定义指令CMake并构建同一可执行文件的 3 个不同名称的版本 我该怎么做呢 我见过set target prop
  • 从 Doctrine 查询返回数组,而不是对象 - Symfony2

    我正在使用这个 this gt getDoctrine gt getRepository MyBundle MyEntity gt findAll array Query HYDRATE ARRAY 我认为应该确保它返回一个数组的数组 但它
  • Xcode:收到警告“从枚举类型 UIDeviceOrientation 进行隐式转换”

    完整警告 Implicit conversion from enumeration type UIInterfaceOrientation to different enumeration type UIDeviceOrientation
  • wpf:通过调度程序更新多个控件

    我正在使用 SerialPort 类中的事件侦听器从串行端口读取数据 在我的事件处理程序中 我需要使用通过串行端口传入的 xml 数据来更新窗口中的许多 30 40 控件 我知道我必须使用 myControl Dispatcher Invo