winforms 更新Windows窗体中的UI对象

lzfw57am  于 2023-04-12  发布在  Windows
关注(0)|答案(3)|浏览(163)

在.net之前,我使用MFC、ON_UPDATE_COMMAND_UI和CCmdUI类来更新我的Windows UI的状态。从旧的MFC/Win32参考:
通常,菜单项和工具栏按钮具有多个状态。例如,如果菜单项在当前上下文中不可用,则该菜单项为灰色。菜单项也可以选中或取消选中。如果工具栏按钮不可用,则该工具栏按钮也可以被禁用,或者可以被选中。
当程序条件改变时,谁来更新这些项的状态?从逻辑上讲,如果菜单项生成一个由文档处理的命令,那么让文档更新菜单项是有意义的。文档可能包含更新所基于的信息。
如果一个命令有多个用户界面对象(可能是一个菜单项和一个工具栏按钮),它们都被路由到同一个处理函数。这将把所有等效用户界面对象的用户界面更新代码封装在一个地方。
该框架提供了一个方便的接口,用于自动更新用户界面对象。您可以选择以其他方式进行更新,但提供的接口是高效且易于使用的。
.net Windows窗体的指导是什么?我在主窗体中使用Application.Idle处理程序,但不确定这是最好的方法。大约在我将所有UI更新放在Idle事件处理程序中的时候,我的应用开始显示一些性能问题,我还没有跟踪此问题的指标。不确定是否相关。

vktxenjb

vktxenjb1#

我发现最简单的方法是让菜单项事件处理程序生成一个后台线程,该线程禁用菜单项,完成工作,然后重新启用菜单项。这样,UI就可以处理其他UI请求,并且我不需要轮询操作何时完成。
我通常包含一个逻辑来防止多个使用相同资源的操作同时发生。这意味着创建一个函数来禁用/启用所有类似的资源。例如,我可能一次只允许一个文件操作发生,所以我会创建一个函数来禁用/启用所有与文件操作相关的菜单项,并从这些菜单项中的每一个调用它。

dz6r00yl

dz6r00yl2#

只是改变他们的属性,例如。

obj.Enabled = true;

obj.Enabled = false;

该对象的属性将自动为您调用.Invalidate().Refresh(),因此控件应自动重绘。
如果你想做一个大的任务,这将阻止UI多秒钟,值得使用Threads + Delegates

2w3rbyxf

2w3rbyxf3#

AFAIK,在标准的.NET System.Windows.Forms世界中,此功能不可用。这个问题可以通过几种方法来解决。下面的链接是有用的资源:
· OnUpdate equivalent
· ActionLists for Windows forms
· Command UI Updating Windows Forms in C#

相关问题