如何从“设置”浮出控件在页面上触发事件

本文关键字:事件 控件 设置 | 更新日期: 2023-09-27 18:36:26

我正在尝试创建一个Windows Metro App。但目前我无法进一步,因为我需要从主页上的设置浮出控件触发事件或调用方法的可能性。但是我在设置浮出控件中没有主页对象,我不知道如何获取一个。有人知道如何做到这一点吗?

如何从“设置”浮出控件在页面上触发事件

好吧,您应该首先了解一些技巧。某些事件(如按钮的单击事件)无法以编程方式触发。有一些 API 调用(例如 ShowUI(),它们不能从事件处理程序调用,这些事件处理程序不是调用堆栈中用户调用的事件的结果。不确定这是否有意义,这只是 WinRT 中的一个特殊之处。但是,假设您没有尝试调用按钮的单击事件或任何需要用户启动它的 API。

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

您遇到此问题是因为浮出控件超出了当前页面的范围。浮出控件不是页面的子项,它只是由页面调用的内容。浮出控件中没有对页面的引用,页面中也没有对浮出控件的引用。那么我们如何沟通呢?

选项 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

高端方法是使用Microsoft模式和实践中的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 开发人员只使用静态事件。有些人靠消息传递生存和死亡。我只是喜欢做有效的事。所有这些选项都有效,包括反射疯狂。最终,选择权在您作为开发人员手中。只有您知道应用程序的详细信息。我希望这有所帮助。

祝你好运!