向 ListView 控件添加子项的线程安全

发布于 2024-12-06 14:21:00 字数 570 浏览 0 评论 0原文

我正在尝试将旧的 Windows 窗体应用程序转换为 WPF 应用程序。

以下代码不再在 C# .NET 4.0 下编译:

// Thread safe adding of subitem to ListView control
private delegate void AddSubItemCallback(
  ListView control,
  int item,
  string subitemText
);

private void AddSubItem(
  ListView control,
  int item,
  string subitemText
) {
  if (control.InvokeRequired) {
    var d = new AddSubItemCallback(AddSubItem);
    control.Invoke(d, new object[] { control, item, subitemText });
  } else {
    control.Items[item].SubItems.Add(subitemText);
  }
}

请帮助转换此代码。

I'm trying to convert an old Windows Forms Application to a WPF application.

The following code no longer compiles under C# .NET 4.0:

// Thread safe adding of subitem to ListView control
private delegate void AddSubItemCallback(
  ListView control,
  int item,
  string subitemText
);

private void AddSubItem(
  ListView control,
  int item,
  string subitemText
) {
  if (control.InvokeRequired) {
    var d = new AddSubItemCallback(AddSubItem);
    control.Invoke(d, new object[] { control, item, subitemText });
  } else {
    control.Items[item].SubItems.Add(subitemText);
  }
}

Please help to convert this code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽清梦 2024-12-13 14:21:00

希望以下博客文章对您有所帮助。在 WPF 中,您使用 Dispatcher.CheckAccess/Dispatcher.Invoke

if (control.Dispatcher.CheckAccess())
{
    // You are on the GUI thread => you can access and modify GUI controls directly
    control.Items[item].SubItems.Add(subitemText);
}
else
{
    // You are not on the GUI thread => dispatch
    AddSubItemCallback d = ...
    control.Dispatcher.Invoke(
        DispatcherPriority.Normal,
        new AddSubItemCallback(AddSubItem)
    );
}

Hopefully the following blog post will help you. In WPF you use Dispatcher.CheckAccess/Dispatcher.Invoke:

if (control.Dispatcher.CheckAccess())
{
    // You are on the GUI thread => you can access and modify GUI controls directly
    control.Items[item].SubItems.Add(subitemText);
}
else
{
    // You are not on the GUI thread => dispatch
    AddSubItemCallback d = ...
    control.Dispatcher.Invoke(
        DispatcherPriority.Normal,
        new AddSubItemCallback(AddSubItem)
    );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文