C# 验证菜单项

C# 验证菜单项,c#,winforms,C#,Winforms,一些我早就想知道的事情: 在WinForms应用程序中,通常有一个“编辑”菜单,其中包含“撤消”和“重做”等条目。必须启用或禁用这些菜单项,具体取决于具有焦点的控件及其撤消堆栈状态。对于此验证,您必须知道焦点何时更改。不幸的是,在标准的C#WinForms应用程序中似乎无法实现这一点。到目前为止,我所做的是为每个控件添加一个OnEnter事件处理程序,但是这很糟糕,对于由后端代码添加的控件(例如,在C++/CLI层中)不起作用。另一种方法是使用消息过滤器,但WM_焦点不通过这样的过滤器发送。覆盖

一些我早就想知道的事情:

在WinForms应用程序中,通常有一个“编辑”菜单,其中包含“撤消”和“重做”等条目。必须启用或禁用这些菜单项,具体取决于具有焦点的控件及其撤消堆栈状态。对于此验证,您必须知道焦点何时更改。不幸的是,在标准的C#WinForms应用程序中似乎无法实现这一点。到目前为止,我所做的是为每个控件添加一个OnEnter事件处理程序,但是这很糟糕,对于由后端代码添加的控件(例如,在C++/CLI层中)不起作用。另一种方法是使用消息过滤器,但WM_焦点不通过这样的过滤器发送。覆盖ActiveControl也不起作用,因为它不是虚拟的。那么,还可以做些什么来验证每次焦点更改时的菜单项呢


注意:我在上读过这篇文章,但是对于这样一个简单的任务来说,这种方法非常复杂。我已经准备好了所有的验证代码。我只需要在焦点转到新控件时触发它。

这有帮助吗?不幸的是,不是这样,因为这是关于如何处理未完成的值之类的。我对这样的值不感兴趣,但是需要一种基于活动控件及其状态设置菜单项启用状态的方法。因此,需要在.NET应用程序中关注自定义C++控件,因此不能使用GoToCo事件吗?我不想将事件处理程序附加到创建的每个控件中,只是为了侦听焦点更改。(这在某种程度上我已经做了很长一段时间了)。相反,我正在寻找一个更通用的解决方案(一个中心点,叫做焦点改变)。