在Windows窗体中更新UI对象

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

通常,菜单项和工具栏按钮具有多个状态。 例如,如果菜单项在当前上下文中不可用,则该菜单项变灰(变暗)。 菜单项也可以选中或取消选中。 如果不可用,也可以禁用工具栏按钮,或者可以检查它。

当程序条件发生变化时,谁更新这些项目的状态? 从逻辑上讲,如果一个菜单项生成一个由文档处理的命令,那么让文档更新菜单项是有意义的。 该文档可能包含更新所基于的信息。

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

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

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

我发现最简单的方法是让菜单项事件处理程序生成一个后台线程,该线程禁用菜单项,完成工作,然后重新启用菜单项。 这样,UI可用于处理其他UI请求,我不需要在操作完成时进行轮询。

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

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

• OnUpdate等效项

• Windows窗体的ActionLists

• 命令UI在C#中更新Windows窗体

只是改变他们的财产,例如

obj.Enabled = true; 

要么

 obj.Enabled = false; 

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

如果你想做一个阻止UI多秒的大任务,那么值得使用Threads + Delegates 。