【问题标题】:WPF toplevel MenuItem enable/disable based on taskWPF 顶级 MenuItem 基于任务启用/禁用
【发布时间】:2010-12-06 21:51:54
【问题描述】:

我有一个顶级菜单项,负责刷新同一窗口中的数据网格。我目前的控制流程是:

  1. 用户点击刷新
  2. 在单击事件处理程序中,我:
    1. 通过设置oMenuItem.IsEnabled = false禁用菜单项。
    2. 调度一个动作以刷新网格,在该动作中,我通过设置 IsEnabled = true 重新启用菜单项

问题在于,即使刷新被禁用,用户也可以点击刷新,就好像点击排队一样。当动作返回时,它会继续处理剩余的“排队”点击。我的期望是:禁用菜单项时的所有点击都会被忽略,只有在启用时,点击才会被确认。

奇怪的是,如果我只是禁用它而不启用它,它就会保持这种状态,即它是 disabled.wpf,

【问题讨论】:

    标签: wpf click menuitem


    【解决方案1】:

    “调度一个动作”是指调用 Dispatcher.BeginInvoke() 或其他类型的异步操作?

    无论如何,在这两种情况下,您都可以获得操作的“句柄”(DispatcherOperation 或 IAsyncResult),并在分派操作时将其存储为字段。完成后 - 将此字段设置为 null。

    在菜单项的单击事件处理程序中检查此字段。如果它为空,则表示可以安全地开始操作。如果它不为 null - 立即返回并且什么也不做。

    还有一些与您的问题无关但很重要的东西 - 为什么不使用命令?这样你就不需要玩事件处理和启用/禁用。当然,可以通过多种方式调用命令(例如 - 用户使用键盘从菜单中选择命令并按下 Enter。不涉及鼠标点击,但应该与点击菜单项相同)。

    亚历克斯。

    【讨论】:

    • 嗨,亚历克斯。感谢您的回复。我也确实使用了 Command 方式,并在我的 CanExecute 处理程序中检查了 MenuItem 的 IsEnabled 属性是否为 false;本质上,e.CanExecute = oMenuItem.IsEnabled。这与我之前的非 IAsyncResult 方法具有相同的行为。我会试一试你的方法,希望能解决这个问题。
    • 命令的作用在于您可以将它们放在 ViewModel 中,从而将表示与逻辑分开。如果您不知道我在说什么,请使用 Google MVVM。 (简而言之 - 它允许您将逻辑作为一个简单的类进行测试,而无需显示包含所有控件的窗口)。无论如何,如果你使用 MVVM,IAsyncResult 字段应该存储在 ViewModel 而不是视图中。
    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 2013-07-03
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2011-01-26
    • 2021-12-08
    • 2013-10-14
    相关资源
    最近更新 更多