【问题标题】:Updating UI objects in windows forms在 Windows 窗体中更新 UI 对象
【发布时间】:2010-03-09 08:28:59
【问题描述】:

在 .net 之前,我使用 MFC、ON_UPDATE_COMMAND_UI 和 CCmdUI 类来更新我的 Windows UI 的状态。 来自较旧的 MFC/Win32 参考:

通常,菜单项和工具栏按钮有多个状态。为了 例如,菜单项是灰色的 (变暗)如果它在 现在的上下文。菜单项也可以 被选中或不选中。工具栏 按钮也可以禁用,如果 不可用,或者可以检查。

谁更新这些项目的状态 随着程序条件的变化? 从逻辑上讲,如果一个菜单项生成一个 例如,由 a 处理的命令 文档,拥有 文档更新菜单项。这 文件可能包含 更新的信息 基于。

如果一个命令有多个 用户界面对象(可能是菜单 项目和工具栏按钮),两者都是 路由到相同的处理函数。 这封装了您的用户界面 更新所有等效的代码 单个用户界面对象 地点。

该框架提供了一个方便的 自动更新界面 用户界面对象。您可以选择 以其他方式进行更新, 但提供的界面是 高效且易于使用。

.net Windows 窗体的指南是什么?我在主窗体中使用 Application.Idle 处理程序,但不确定这是执行此操作的最佳方法。大约在我将所有 UI 更新放在 Idle 事件处理程序中时,我的应用程序开始出现一些性能问题,而且我还没有指标来追踪这个问题。不确定是否相关。

【问题讨论】:

  • 你到底想做什么?您是否尝试禁用 WinForms 应用程序上的控件?
  • 禁用/启用工具栏按钮、菜单项等。检查/取消选中工具栏上检查按钮的状态,显示检查状态的菜单项。之类的东西。非常常规的东西。
  • 是的,Application.Idle。当应用程序空闲时,你怎么会遇到性能问题是神秘的。

标签: c# winforms


【解决方案1】:

我发现让菜单项事件处理程序产生一个后台线程来禁用菜单项、完成工作然后重新启用菜单项是最简单的。这样,UI 就可以处理其他 UI 请求了,我不需要轮询操作何时完成。

我通常包含防止多个使用相同资源的操作同时发生的逻辑。这意味着创建一个函数来一次禁用/启用所有类似的资源。例如我可能一次只允许进行 1 个文件操作,因此我将创建一个函数来禁用/启用与文件操作关联的所有菜单项,并从每个菜单项中调用它。

【讨论】:

    【解决方案2】:

    AFAIK,在标准的 .NET System.Windows.Forms 世界中,此功能不可用。 这个问题可以通过几种方式来回答。以下链接是有用的资源:

    OnUpdate equivalent

    ActionLists for Windows forms

    Command UI Updating Windows Forms in C#

    【讨论】:

    • 我以前看过其中一些链接,并且我有自己的命令模式实现。所有这些人都在使用 Application.Idle 事件进行更新。我想这就是它的全部。然而,旧的 C++ MFC 方式非常酷。
    【解决方案3】:

    只需更改他们的属性,例如

    obj.Enabled = true;
    

    obj.Enabled = false;
    

    该对象的属性会自动为您调用.Invalidate().Refresh(),因此应自动重新绘制控件。

    如果你想做一个会阻塞 UI 几秒钟的大任务,那么使用 Threads + Delegates 是值得的。

    【讨论】:

    • 这就是我现在在主窗体的 Application.Idle 处理程序中所做的。我试图找出其他人是如何在何时何地这样做的。我无法使用数据绑定,因为我使用的 devexpress 菜单和工具栏不为此提供数据绑定。
    • 这意味着要为更大的表单炸毁 Application.Idle-handler。你真的不应该这样做。只是在必要时这样做。例如:将 onclick 事件添加到按钮。在您的处理程序中,禁用另一个控件。不要把它放在 application.idle 中。
    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多