【问题标题】:How to force a certain Event sequence如何强制某个事件序列
【发布时间】:2014-03-31 06:09:28
【问题描述】:

我写了一个小控件,它为我的 Win8 Phone 应用程序创建了一个弹出窗口,它为我做了所有讨厌的事情,比如旋转、正确放置等。 弹出窗口在 Popup 控件中打开,但不在新电话页面上。 为了关闭弹出窗口,我的控件连接到底层页面的“backKeyPressed”事件。 这就像魅力一样,直到底层页面有自己的 BackKeyPressed 事件实现。在这种情况下,页面事件被触发,而不是弹出控件事件。

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

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

我还有哪些其他选择可以克服这种情况?

【问题讨论】:

    标签: c# windows-phone-8


    【解决方案1】:

    通常您不能更改触发事件的顺序 - 它们按注册顺序执行,但规范不要求 - source

    但是作为Jon Skeet says here:

    总结:对于所有正常的事件,您都可以依赖排序。理论上,事件可以为所欲为,但我从未见过没有保持适当顺序的事件。

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

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

    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"); });
        }
    }
    

    【讨论】:

    • 如果我将代码(构造函数除外)放在一个单例中以便为所有页面提供一个中心位置,这将有所帮助。但是仍然需要手动修改所有页面。现在,我在我的 PopupHelper 类中添加了一堆打开的弹出窗口,该类构建弹出窗口并处理它们的打开/关闭。在Page的OnBackKeyPressed事件中,我在popuphelper中调用了一个TryClose()方法(静态)。如果为真,我取消后退导航。如果页面没有 backKeyPressed 事件,PopupHelper 也会注册到该事件中。我仍然希望有一种不涉及页面的方法:-)
    • @eX0du5 看看你也可以基于这段代码扩展你的PhoneApplicationPage。您还可以修改您创建的事件的add,以便将新的处理程序添加到顶部。您还可以提供一些方法来更改顺序/排序列表。
    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 2010-10-27
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2012-12-20
    相关资源
    最近更新 更多