如何停止收听核心窗口字符接收事件?

时间:2018-02-02 07:05:27

标签: c# .net uwp

我有Page,其中我已注册CharacterReceived事件如下:

 Window.Current.CoreWindow.CharacterReceived += CoreWindow_CharacterReceived;

同样在同一页面上,还有一个用作控件的用户控件。在该用户控件中,我有另一个键处理事件,如下所示:

 Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += PageCoreDispatcher_AcceleratorKeyActivated;

现在当这个弹出窗口打开并按下任何键时,事件都会被触发。有没有办法禁用父级CharacterReceived事件,而不是再次启用它。

我知道可以通过在弹出窗口打开时取消注册CharacterReceived事件并在关闭弹出窗口时再次注册来实现,但要做到这一点,我必须为复杂逻辑做一些解决方法。我想从CharacterReceived本身取消注册UserControl

1 个答案:

答案 0 :(得分:0)

事件本身是不同的。例如,如果您在两个地方都使用了AcceleratorKeyActivated,则可以使用AcceleratorKeyEventArgs.Handled属性在UserControl处理事件后停止事件传播。

如果这不是您的选择,您可以通过在页面上公开某些方法来解决问题,这将开始和停止观察事件:

public void StartObserving() => 
   Window.Current.CoreWindow.CharacterReceived += CoreWindow_CharacterReceived;

public void StopObserving() =>
   Window.Current.CoreWindow.CharacterReceived -= CoreWindow_CharacterReceived;     

现在,您可以在适当的时候从用户控件中调用这些方法。要获取当前显示页面的实例,可以使用Window.Current属性:

var rootFrame = Window.Current.Content as Frame; //if your window contains a frame on top
var page = rootFrame.Content as MyPageType; //where MyPageType is the type of your page
page.StopObserving();