C# 如何强制某个事件序列

C# 如何强制某个事件序列,c#,windows-phone-8,C#,Windows Phone 8,我写了一个小控件,为我的Win8手机应用程序创建了一个弹出窗口,它为我做了所有讨厌的事情,比如旋转、正确放置等等。 弹出窗口在弹出控件中打开,但不在新的手机页面上打开。 要关闭弹出窗口,我的控件将连接到基础页面的“backKeyPressed”事件。 在底层页面有自己的BackKeyPressed事件实现之前,这就像charm一样有效。在这种情况下,会触发页面事件,但不会触发弹出控件事件 如果我想拥有该事件,我可以创建自己的堆栈来首先调用最后添加的事件,但我不拥有页面的事件。 据我所知,一旦我的

我写了一个小控件,为我的Win8手机应用程序创建了一个弹出窗口,它为我做了所有讨厌的事情,比如旋转、正确放置等等。 弹出窗口在弹出控件中打开,但不在新的手机页面上打开。 要关闭弹出窗口,我的控件将连接到基础页面的“backKeyPressed”事件。 在底层页面有自己的BackKeyPressed事件实现之前,这就像charm一样有效。在这种情况下,会触发页面事件,但不会触发弹出控件事件

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

BackKeyPressed事件只能有一个实现,它会通知弹出控件自行关闭(如果打开),如果没有打开任何内容,则执行特定于页面的实现。但这需要在我可能想使用弹出窗口的所有页面上更改代码。更糟糕的是,如果我有5个可能的弹出窗口,我必须检查所有这些窗口:-( 因此,我正在寻找一种集中处理这个问题的方法


我还需要哪些其他选项来克服这种情况?

通常情况下,您不能更改激发事件的顺序-它们是按注册顺序执行的,但规范不要求这样做

但作为:

小结:对于所有正常的事件,你都可以依赖顺序。理论上,事件可以随心所欲,但我从未见过一个事件不保持适当的顺序

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

但出于您的目的(我认为),您可以设置一个事件来调用您控制顺序的方法。我认为简单的示例可以显示这种行为:

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"); });
    }
}
public部分类主页:PhoneApplicationPage
{
私有列表listofHandler=新列表();
私有void调用方法(对象发送方,CancelEventArgs e)
{
for(int i=0;i{MessageBox.Show(“添加的第一个”);e.Cancel=true;};
AddToTop((s,e)=>{MessageBox.Show(“后来添加”);});
}
}

如果我输入代码(构造函数除外),这会有所帮助在单例中,所有页面都有一个中心位置。但仍然需要手动修改所有页面。目前,我向PopusUpper类添加了一堆打开的弹出窗口,该类构造弹出窗口并处理弹出窗口的打开/关闭。在页面的OnBackKeyPressed事件中,我调用TryClose()方法(静态)如果为true,我将取消后向导航。如果该页面没有backKeyPressed事件,则该Popusculper也将注册到该事件。但我仍然希望有一种不涉及该页面的方法:-)@eX0du5看起来您也可以基于此代码扩展您的PhoneApplicationPage。您还可以修改所创建事件的
add
,以便将新处理程序添加到顶部。您还可以提供一些方法来更改订单/排序列表。