2015-01-05 35 views
0

我想创建一个Windows Metro应用程序。但目前我无法进一步探索,因为我需要在主页上触发事件或调用settingsflyout中的方法。但是我在settingsflyout没有mainpage对象,我不知道如何得到它。 有人知道如何做到这一点?如何从设置弹出页面触发事件

回答

2

那么,首先应该了解一些技巧。某些事件,如按钮的单击事件,不能以编程方式触发。有一些API调用,例如ShowUI(),它不能从事件处理程序中调用,这些事件处理程序不是调用堆栈中用户调用事件的结果。不知道这是否合理,这只是WinRT中的一件特别的事情。但是让我们假装你没有试图调用按钮的点击事件或任何需要用户启动它的API。

有几种方法可以做你想做的。这实际上比Windows运行时或XAML讨论更像C#讨论。但是,没关系。这是一个重要的问题。

您遇到此问题是因为弹出窗口超出了当前页面的范围。弹出不是页面的子节点,它只是由页面调用的东西。在弹出窗口或页面中的弹出窗口中没有对页面的引用。那么我们如何沟通?

选项1

您可以创建在由弹出的提出和通过的页面处理app.xaml.cs公共静态事件。由于外部类无法引发其他类的事件,因此您的app.xaml.cs还需要一个触发该事件的公共静态方法(可由该弹出窗口调用该方法)。

有点像这个

public static event EventHandler MyEvent; 
public static void RaiseMyEvent() 
{ 
    if (MyEvent != null) MyEvent(null, EventArgs.Empty); 
} 

这是一个很好的解决方案,因为它可以让弹出的倾诉任何页面调用它不知道调用它的页面。这意味着两个页面可以调用弹出窗口,并且都使用相同的模式对其作出反应。

警告:当您在页面中订阅app.xaml.cs事件时,请不要重复在离开页面时取消订阅它。请记住,垃圾回收不会从内存中移除任何对其他对象有强烈引用的对象 - 包括事件处理程序。因此,使用逻辑+=时,一定要包含您的-=逻辑。 :)

选项2

如果没有理由让你从多个页面调用弹出你可以随时把静态方法页面本身上。该弹出窗口可以调用此方法,并在您的页面上调用某种类型的操作,而无需引用调用它的实例。只要你没有一个以上的页面实例,这可以很好地工作。

选项3

选项2的反向是订阅上弹出的一个事件。只要您在页面导航时注意取消订阅此事件的警告,则可以这样做。

注:所有三个选项工作得很好。任何人告诉你他们是不好的想法实际上只是警告你,他们是你可以轻易搞错的方法。如果是我之间的选择,我会选择选项1.但是,如果您选择选项2或3,我不认为您犯了一个错误,只是一种开发人员偏好选择。只记得取消订阅。

选项4

高端的方法是使用消息服务就像从微软的模式和做法PubSubEvents。我在模块(07) Prism - Part 2中详细描述了这一点。 MVVM Light中还有一个消息服务,可以使用。这些事件聚合器以抽象方式完成我在选项1中描述的内容。这不是优越的。但它是可重复的,不太可能通过强有力的参考来实施。如果这听起来很有意思,那么您可以使用消息传递服务来完成您在问题中描述的任务。

查找模块7这里:http://blog.jerrynixon.com/2014/10/ready-to-learn-developing-universal.html

选5+

还有其他的方法,当然。您可以在您的弹出窗口的构造函数中传递页面的引用 - 虽然这很容易出错和误用,但我不会推荐它。您可以使用VisualTreeHelper来拼写CoreWindow的根元素以查找页面并使用反射调用某些内容。再一次,技术上可行,但不推荐,因为它是一堆代码,很容易出错。

您所在位置的大多数XAML开发人员仅使用静态事件。有些人靠着消息生活而死。我只想做一些有用的事情。所有这些选项都有效,包括反思的疯狂。最终,选择是你的开发者。只有你知道你的应用程序的细节。我希望这有帮助。

祝你好运!

+0

感谢您的帮助...您的回答帮助我找到正确的方式...我已经使用此解决方案http://stackoverflow.com/a/6716539/2890223 – Damien

相关问题