如何强制某个事件序列

本文关键字:事件 何强制 | 更新日期: 2023-09-27 17:55:07

我写了一个小控件,为我的Win8手机应用程序创建一个弹出窗口,它为我做了所有讨厌的事情,比如旋转,适当的位置等。弹出窗口是在弹出控件中打开的,而不是在新的电话页面上打开的。为了关闭弹出窗口,我的控件连接到底层页面的"backKeyPressed"事件。在底层页面拥有自己的BackKeyPressed事件实现之前,这种方法非常有效。在这种情况下,页面事件被触发,而不是弹出控件事件。

如果我拥有事件,我可以创建自己的堆栈来首先调用最后添加的事件,但我不拥有页面的事件。据我所知,我无法注销任何先前附加的事件处理程序,并在控件从事件退订后重新分配它。

我可以只有一个实现的BackKeyPressed事件,然后通知弹出控件关闭自己(如果打开),如果没有打开,做页面特定的实现。但这将需要在我可能想要使用弹出窗口的所有页面上更改代码。更糟糕的是,如果我有5个可能的弹出窗口,我必须检查所有的:-(所以我正在寻找一个选项来处理这个集中。

我有什么其他的选择来克服这种情况?

如何强制某个事件序列

通常情况下,你不能改变触发事件的顺序——它们是按照注册的顺序执行的,但这不是规范所要求的。

但是正如Jon Skeet在这里所说的:

Summary:对于所有相同的事件,您可以依赖于排序。理论上,事件可以做他们喜欢做的事,但我从来没有见过一个事件不保持适当的顺序。

它是按注册顺序触发的,应该是。

但是对于你的目的(我认为),你可以设置一个事件来调用你的方法,你可以控制顺序。我想一个简单的例子可以展示这个行为:

public partial class MainPage : PhoneApplicationPage
{
    private List<EventHandler<CancelEventArgs>> listOfHandlers = new List<EventHandler<CancelEventArgs>>();
    private void InvokingMethod(object sender, CancelEventArgs e)
    {
        for (int i = 0; i < listOfHandlers.Count; i++) 
            listOfHandlers[i](sender, e);
    }
    public event EventHandler<CancelEventArgs> myBackKeyEvent
    {
        add { listOfHandlers.Add(value); }
        remove { listOfHandlers.Remove(value); }
    }
    public void AddToTop(EventHandler<CancelEventArgs> eventToAdd)
    {
        listOfHandlers.Insert(0, eventToAdd);
    }
    public MainPage()
    {
        InitializeComponent();
        this.BackKeyPress += InvokingMethod;
        myBackKeyEvent += (s, e) => { MessageBox.Show("Added first"); e.Cancel = true; };
        AddToTop((s, e) => { MessageBox.Show("Added later"); });
    }
}