【问题标题】:Silverlight 4 Key Event at Control LevelSilverlight 4 控制级别的关键事件
【发布时间】:2012-01-12 16:59:47
【问题描述】:

我有一个 Silverlight 控件 (ChildWindow),我想接收所有按键按下事件。问题是,如果我简单地说

this.KeyDown += new KeyEventHandler(EventDetailsPopup_UC_KeyDown)

它不起作用,因为事件被路由到它的所有子控件。如何从 UserControl 或 ChildWindow 级别接收键或鼠标事件?谢谢

【问题讨论】:

    标签: c# silverlight silverlight-4.0


    【解决方案1】:

    你没有用“它不起作用”来描述你的意思,但我至少可以给你一些背景知识。

    Silverlight 支持路由事件的概念。当在子控件上触发路由事件时,它会向上传递逻辑树,在控件的父级上触发,然后是父级的父级等......直到满足根视觉。 this MSDN page 详细介绍了路由事件列表。这称为冒泡

    您似乎想阻止子控件看到此事件?即您想通过将其设置为已处理来取消它。不幸的是,这是不可能的,因为子控件总是首先接收事件。为了支持这一点,您需要一个名为 tunneling 的功能,其中在触发冒泡事件之前,“预览”事件首先从父级隧道传输到子级。这是 WPF 特定的功能,如上面引用的 MSDN 页面中所述。

    【讨论】:

      【解决方案2】:

      或者如果“不会工作”意味着您没有收到该事件。 这可能是因为某些子元素已将 eventarguments 的 Handled 参数设置为 true。

      但是您仍然可以在代码中注册侦听已处理的事件,比如说在您的 childwindow 的构造函数中:

      this.AddHandler(KeyDownEvent, (KeyEventHandler)YourHandlerFunction, true);
      

      【讨论】:

      • 正确,“不起作用”意味着根控件没有得到事件,因为它的一个子控件处理了它。我在主控件中嵌套了许多子控件,因此遍历每个子控件及其每个组件并将它们设置为未处理会有点混乱。只是想知道根控件是否有办法在不知道其子控件的情况下仍接收此事件。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2011-02-21
      相关资源
      最近更新 更多