【问题标题】:Raise Event on When a different event raised - C#引发不同事件时引发事件 - C#
【发布时间】:2015-09-18 04:06:11
【问题描述】:

我在 WPF 应用程序中创建了自己的 Button User 控件。

在此,我试图在另一个事件上引发一个附加多个事件处理程序的事件。

我为视图和业务逻辑 (MVVM) 附加了多个带有“MouseUp”事件的事件处理程序。我只想用“Enter”和“SpaceBar”在“KeyUp”上触发所有附加“MouseUp”事件的处理程序

这是我用来在“KeyUp”上引发“MouseUp”事件的示例代码,如果键是输入或空格

 void Button_KeyUp(object sender, KeyEventArgs e)
 {
      if (e.Key == Key.Space || e.Key == Key.Enter)
      {
          RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)
          {
              RoutedEvent = Mouse.MouseUpEvent,
              Source = this,
          });
       }                
  }

不确定。我可能错了。但它对我有用。但是,并非在所有情况下。

在某些情况下,事件未按预期引发。

在我的进一步调查中,我看到按键事件被触发。但是在某些对象中没有引发“MouseUp”事件中的事件处理程序。

有什么优雅的方法可以满足我的需求。

【问题讨论】:

  • 与其试图从另一个不相关的事件中引发一个事件,不如将处理逻辑提取到一个方法中并从两个处理程序中调用它
  • 这听起来像是the XY Problem 的案例,询问您尝试的解决方案而不是实际问题。您要在这里解决的实际问题是什么?

标签: c# wpf events c#-4.0


【解决方案1】:

这打破了任何阅读代码的人的预期模式 - 为什么在释放键时需要触发 mouseup 事件?如果只是为了避免代码重复,你应该有一个单独的方法,mouseupkeyup 调用。

根据 cmets,如果附加了多个事件处理程序,则需要将所有事件处理程序附加到这两个事件。或者,您可以创建一个元事件处理程序,将所有其他事件作为方法调用,然后将其附加到每个事件。

【讨论】:

  • 是的。我这样做是为了避免代码重复。此外,我为视图和业务逻辑 (MVVM) 附加了多个带有“MouseUp”事件的事件处理程序。我只想用“Enter”和“SpaceBar”在“KeyUp”上触发所有带有“MouseUP”的处理程序
  • 有没有其他优雅的方式来做到这一点。请建议我。谢了。 .
  • 如果您希望所有这些事件都执行相同的操作,请将所有这些处理程序附加到每个事件。
【解决方案2】:

只需创建函数并分别处理事件,添加对该函数的引用作为事件处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多