C# 如何强制某个事件序列
我写了一个小控件,为我的Win8手机应用程序创建了一个弹出窗口,它为我做了所有讨厌的事情,比如旋转、正确放置等等。 弹出窗口在弹出控件中打开,但不在新的手机页面上打开。 要关闭弹出窗口,我的控件将连接到基础页面的“backKeyPressed”事件。 在底层页面有自己的BackKeyPressed事件实现之前,这就像charm一样有效。在这种情况下,会触发页面事件,但不会触发弹出控件事件 如果我想拥有该事件,我可以创建自己的堆栈来首先调用最后添加的事件,但我不拥有页面的事件。 据我所知,一旦我的控件取消订阅事件,我就无法注销任何以前附加的事件处理程序并重新分配它 BackKeyPressed事件只能有一个实现,它会通知弹出控件自行关闭(如果打开),如果没有打开任何内容,则执行特定于页面的实现。但这需要在我可能想使用弹出窗口的所有页面上更改代码。更糟糕的是,如果我有5个可能的弹出窗口,我必须检查所有这些窗口:-( 因此,我正在寻找一种集中处理这个问题的方法C# 如何强制某个事件序列,c#,windows-phone-8,C#,Windows Phone 8,我写了一个小控件,为我的Win8手机应用程序创建了一个弹出窗口,它为我做了所有讨厌的事情,比如旋转、正确放置等等。 弹出窗口在弹出控件中打开,但不在新的手机页面上打开。 要关闭弹出窗口,我的控件将连接到基础页面的“backKeyPressed”事件。 在底层页面有自己的BackKeyPressed事件实现之前,这就像charm一样有效。在这种情况下,会触发页面事件,但不会触发弹出控件事件 如果我想拥有该事件,我可以创建自己的堆栈来首先调用最后添加的事件,但我不拥有页面的事件。 据我所知,一旦我的
我还需要哪些其他选项来克服这种情况?通常情况下,您不能更改激发事件的顺序-它们是按注册顺序执行的,但规范不要求这样做 但作为: 小结:对于所有正常的事件,你都可以依赖顺序。理论上,事件可以随心所欲,但我从未见过一个事件不保持适当的顺序 它是按注册顺序发射的,应该是 但出于您的目的(我认为),您可以设置一个事件来调用您控制顺序的方法。我认为简单的示例可以显示这种行为:
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
,以便将新处理程序添加到顶部。您还可以提供一些方法来更改订单/排序列表。