我有Page
,其中我已注册CharacterReceived
事件如下:
Window.Current.CoreWindow.CharacterReceived += CoreWindow_CharacterReceived;
同样在同一页面上,还有一个用作控件的用户控件。在该用户控件中,我有另一个键处理事件,如下所示:
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += PageCoreDispatcher_AcceleratorKeyActivated;
现在当这个弹出窗口打开并按下任何键时,事件都会被触发。有没有办法禁用父级CharacterReceived
事件,而不是再次启用它。
我知道可以通过在弹出窗口打开时取消注册CharacterReceived
事件并在关闭弹出窗口时再次注册来实现,但要做到这一点,我必须为复杂逻辑做一些解决方法。我想从CharacterReceived
本身取消注册UserControl
。
答案 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();