如何强制某个事件序列
本文关键字:事件 何强制 | 更新日期: 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"); });
}
}