(XAML UWP) 定义元素,包括跨多个页面使用的事件 (c++)

(XAML UWP) Defining elements, including events for use across multiple pages (c++)

所以我目前正在尝试集中一些我计划在我的应用程序的几个地方使用的元素。例如,我有一个弹出窗口作为应用程序的一部分导航菜单,但我 运行 遇到的问题是我无法在我定义它的应用程序资源中设置 "Click" 事件在 App.xaml

<Application.Resources>
    <Flyout x:Key="guided_tour_nav">
        <StackPanel>
            <Button x:Name="home"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Return to Home" Click="home_button_Click"/>
            <Button x:Name="water"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="The Water Enters"/>
            <Button x:Name="eggs"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Eggs Arrive"/>
            <Button x:Name="pre_hatch"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Pre-Hatching"/>
            <Button x:Name="tanks"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="The Tanks"/>
            <Button x:Name="life_support"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Life Support"/>
            <Button x:Name="waste"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Filtering Waste"/>
            <Button x:Name="release"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="The Release"/>
        </StackPanel>
    </Flyout>
</Application.Resources>

我在我的 mainpage.xaml 和其他一些页面中使用它

<Button Flyout="{StaticResource guided_tour_nav}" Content="Jump to Section"/>

我目前遇到错误

WMC1005 Events cannot be set in the Application class XAML file

我希望能够定义整个元素、点击事件和所有元素,以便在我需要的任何地方引用,而不必为每个页面重新定义点击事件。我想这一定是有可能的,但我对 UWP 平台完全陌生。

当您在 Application.Resources 中创建 Flyout 作为资源时,很遗憾,您不能将其用于事件。

但是有两种替代解决方案。

自定义用户控件

您可以将 Flyout 包装到自定义 XAML 用户控件中,然后轻松地在任何地方重复使用。

Solution Explorer 中右键单击您的 UWP 项目,然后 select Add - New item。 ..。在对话框 select XAML 部分中找到 User Control 选项。 Select 所需的名称(例如 GuidedTourNav)并单击 添加

这将创建三个文件 - GuidedTourNavFlyout.xamlGuidedTourNavFlyout.xaml.hGuidedTourNavFlyout.xaml.cpp。自定义 XAML 控件的默认类型是 UserControl。你需要改变这个。打开 GuidedTourNavFlyout.xaml 文件并将根元素从 UserControl 更改为 Flyout:

<Flyout
    x:Class="xxxxxx"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="xxxxxxx"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
</Flyout>

最后,将 GuidedTourNavFlyout.xaml 代码中的 Grid 替换为您的弹出内容,并像往常一样在代码隐藏中创建所需的事件处理程序。

现在您可以在任何地方使用您的自定义弹出按钮。首先将 XML 命名空间声明添加到页面的根元素。将 MyApp.CustomControls 替换为自定义控件所在的名称空间。

xmlns:controls="using:MyApp.CustomControls"

现在您可以使用复杂的 属性:

在任何您想要的地方使用弹出按钮
<Button Content="Hello">
    <Button.Flyout>
        <controls:GuidedTourNavFlyout />
    </Button.Flyout>
</Button>

使用带有代码隐藏的资源字典

另一种解决方案是创建一个代码隐藏为 的资源字典。然而,这种方法似乎不太干净,我无法确认它在 C++ 中是否有效。