在 UWP 中,我如何获取 Grid 的实例,它位于 Flyout 中,它本身位于 ResourceDictionary 中?

In UWP, how would I get the instance of a Grid, that's in a Flyout, that is itself in a ResourceDictionary?

我有一个 UWP 应用程序,它将部署到带有屏幕的设备上。该设备是 运行 Windows 10 IoT 核心。

我想要某种形式的警报系统,但因为我无法使用 UWP ToastNotification,所以我决定创建自己的警报系统。我为通知创建了一个 UserControl,效果很好。我在 Flyout 中动态显示控件,在一定程度上可以正常工作。

浮出控件位于 ResourceDictionary 中,如下所示:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:HCI">

    <Flyout x:Key="ToastNotificationFlyout" x:Name="ToastFlyout" 
            ShowMode="Transient" AllowFocusOnInteraction="False">
        <Grid x:Name="ToastContainer" />
    </Flyout>

</ResourceDictionary>

我有一个静态class...

static class Globals
{
    public static Flyout GlobalFlyout;
}

...这使我可以从我的代码中的任何 class 引用浮出控件(通过内容框架动态加载的页面)。

在我的 MainPage 实例中,我创建了这样的引用:

Globals.GlobalFlyout = (Flyout)Application.Current.Resources["ToastNotificationFlyout"];

然后我可以在 C# 中引用 Flyout,但我似乎无法获得对 Grid 的引用。 Flyout 不包含 .FindName() 方法,使用 VisualTreeHelper 会引发灾难性异常(在另一个用户的另一个 SO 问题中进行了解释)。 我还尝试了对 .FindChild().FindControl() 的各种调用,我在这里和其他社区都找到了,但是 none 适用于这种情况。

Flyout 的内容很简单,模仿了常规 Win10 toast 通知的外观。

有没有想过如何在 Flyout 中引用 Grid,以便我可以添加通知控件的实例?

Grid实际存放在Flyout.Content property下:

var grid = (Grid)Globals.GlobalFlyout.Content;

当您将直接子代放在 Flyout 中时,XAML 会将其解释为 Content。这是使用 ContentPropertyAttribute.

在幕后完成的