如何停止调用OnBackKeyPress方法在按下硬件后退键在wp8
本文关键字:硬件 wp8 何停止 调用 OnBackKeyPress 方法 | 更新日期: 2023-09-27 18:14:14
我有这个要求,我需要显示一个自定义弹出作为页面覆盖。这个自定义的弹出窗口是随机的,可以显示在任何页面上(基于一些逻辑)。我已经在这个自定义PopUp类中注册了OnBackKeyPress
事件(用于当前页面)。
但是,因为几乎所有的应用程序的页面也有一个OnBackKeyPress
方法定义(再次根据业务需求),新的事件注册(在自定义PopUp类)发生在前一个之后。因此,按下硬件后退键,在页面中编写的OnBackKeyPress
方法首先被调用,然后是在自定义弹出类中编写的OnBackKeyPress
方法。我需要避免调用OnBackKeyPress
方法写在页。
不接受解决方案:
- 使新的弹出控件作为
PhoneApplicationPage
(我们需要一些透明度,我们可以显示当前页面的数据) - 把检查
OnBackKeyPress
方法在所有页面的弹出(这么多页面在ap!) - 扩展
PhoneApplicationPage
并编写一个新的OnBackKeyPress
方法来处理相同的(不不!)
下面是一个如何在已订阅处理程序之前订阅事件的示例:
class EventTesterClass // Simple class that raise an event
{
public event EventHandler Func;
public void RaiseEvent()
{
Func(null, EventArgs.Empty);
}
}
static void subscribeEventBeforeOthers<InstanceType>(InstanceType instance, string eventName, EventHandler handler) // Magic method that unsubscribe subscribed methods, subscribe the new method and resubscribe previous methods
{
Type instanceType = typeof(InstanceType);
var eventInfo = instanceType.GetEvent(eventName);
var eventFieldInfo = instanceType.GetField(eventInfo.Name,
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.GetField);
var eventFieldValue = (System.Delegate)eventFieldInfo.GetValue(instance);
var methods = eventFieldValue.GetInvocationList();
foreach (var item in methods)
{
eventInfo.RemoveEventHandler(instance, item);
}
eventInfo.AddEventHandler(instance, handler);
foreach (var item in methods)
{
eventInfo.AddEventHandler(instance, item);
}
}
static void Main(string[] args)
{
var evntTest = new EventTesterClass();
evntTest.Func += handler_Func;
evntTest.Func += handler_Func1;
evntTest.RaiseEvent();
Console.WriteLine();
subscribeEventBeforeOthers(evntTest, "Func", handler_Func2);
evntTest.RaiseEvent();
}
static void handler_Func(object sender, EventArgs e)
{
Console.WriteLine("handler_Func");
}
static void handler_Func1(object sender, EventArgs e)
{
Console.WriteLine("handler_Func1");
}
static void handler_Func2(object sender, EventArgs e)
{
Console.WriteLine("handler_Func2");
}
输出将是:
handler_Func
handler_Func1
handler_Func2
handler_Func
handler_Func1