如何停止调用OnBackKeyPress方法在按下硬件后退键在wp8

本文关键字:硬件 wp8 何停止 调用 OnBackKeyPress 方法 | 更新日期: 2023-09-27 18:14:14

我有这个要求,我需要显示一个自定义弹出作为页面覆盖。这个自定义的弹出窗口是随机的,可以显示在任何页面上(基于一些逻辑)。我已经在这个自定义PopUp类中注册了OnBackKeyPress事件(用于当前页面)。

但是,因为几乎所有的应用程序的页面也有一个OnBackKeyPress方法定义(再次根据业务需求),新的事件注册(在自定义PopUp类)发生在前一个之后。因此,按下硬件后退键,在页面中编写的OnBackKeyPress方法首先被调用,然后是在自定义弹出类中编写的OnBackKeyPress方法。我需要避免调用OnBackKeyPress方法写在页。

不接受解决方案:

  1. 使新的弹出控件作为PhoneApplicationPage(我们需要一些透明度,我们可以显示当前页面的数据)
  2. 把检查OnBackKeyPress方法在所有页面的弹出(这么多页面在ap!)
  3. 扩展PhoneApplicationPage并编写一个新的OnBackKeyPress方法来处理相同的(不不!)

如何停止调用OnBackKeyPress方法在按下硬件后退键在wp8

下面是一个如何在已订阅处理程序之前订阅事件的示例:

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