我想创建一个Windows Metro应用程序。但目前我无法进一步探索,因为我需要在主页上触发事件或调用settingsflyout中的方法。但是我在settingsflyout没有mainpage对象,我不知道如何得到它。 有人知道如何做到这一点?如何从设置弹出页面触发事件
回答
那么,首先应该了解一些技巧。某些事件,如按钮的单击事件,不能以编程方式触发。有一些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开发人员仅使用静态事件。有些人靠着消息生活而死。我只想做一些有用的事情。所有这些选项都有效,包括反思的疯狂。最终,选择是你的开发者。只有你知道你的应用程序的细节。我希望这有帮助。
祝你好运!
- 1. Silverlight - 如何设置触发器弹出
- 2. 如何设置弹出窗体页面?
- 3. 当弹出窗口关闭时在页面上触发事件
- 4. 页面加载事件不会触发JavaScript模式内弹出
- 5. 如何从“设置”弹出框更新页面的控件
- 6. 当事件触发,页面从默认
- 7. 如何设置我的页面,以便Enter键事件不会触发回发?
- 8. 如何捕获从弹出IE窗口触发的事件
- 9. 触发angular.ui弹出事件,但点击
- 10. 弹出关闭后触发的事件
- 11. UpdatePanel触发器,如何设置__doPostBack的触发事件?
- 12. 如何为Android小部件制作弹出式设置页面
- 13. 主页面onmenuitemdatabound事件在页面pre_render事件之前触发?
- 14. 如何从包含页面(可视页面)触发按钮单击事件
- 15. WPF弹出式事件处理 - 如何在弹出窗口打开时触发
- 16. 如何跟踪触发弹出式窗口的数据事件
- 17. 如何触发DropDownList的事件里面剑道调度资源(弹出)
- 18. propertychange事件触发页面加载
- 19. 触发页面加载事件
- 20. 事件触发离开页面
- 21. Javascript事件触发页面加载
- 22. JQuery Mobile页面事件未触发
- 23. onclick事件内的触发引导弹出式事件
- 24. 如何从一个php页面触发
- 25. 在事件触发器中设置VerticalAlignment
- 26. wpf:TextChanged事件触发设置DataContext
- 27. 如何从弹出框中发出AngularJS事件?
- 28. iText:如何为页脚旋转的页脚事件设置页面事件?
- 29. 如何让控件在事件触发时设置属性
- 30. 如何在设备配置文件更改时触发事件?
感谢您的帮助...您的回答帮助我找到正确的方式...我已经使用此解决方案http://stackoverflow.com/a/6716539/2890223 – Damien