从父 Shell xaml 访问子 xaml 页面中创建的按钮

Accessing a button created in a sub xaml page from it's parent Shell xaml

我正在使用 SplitView 应用程序,我创建了一个 Shell 来托管子页面。我想要做的是在子页面上有一个按钮,单击该按钮可以操纵最初在 Shell xaml 上启动或创建的对象的可见性。但是,我不确定如何调用更改 SplitView 属性所需的 class 或框架。

我的层次结构如下:Shell > 页面文件夹 > 子页面

这是我的 Shell.xaml 的片段请注意,这只是 SplitView

中包含的一部分
<SplitView.Pane>
        <StackPanel x:Name="SplitViewPanePanel">
            <RadioButton x:Name="BackRadioButton" Click="BackRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE112;" Background="Gray" Content="Back" GroupName="Back"/>
            <RadioButton x:Name="HamburgerRadioButton" 
                         Click="HamburgerRadioButton_Click" 
                         Style="{StaticResource NavRadioButtonStyle}" 
                         Tag="&#xE700;"
                         Content="Menu" />

            <RadioButton x:Name="HomeRadioButton" Click="HomeRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE80F;" Content="Home" GroupName="Navigation"/>
            <RadioButton x:Name="TARadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE179;" Content="Team Assignments" GroupName="Navigation"/>
            <RadioButton x:Name="ASRRadioButton" Click="ASRRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE13C;" Content="Assignment Switch Requests" GroupName="Navigation"/>
            <RadioButton x:Name="MTRadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE15E;" Content="Management Tools" GroupName="Navigation"/>
        </StackPanel>
</SplitView.Pane>

下面是我的 "Home" 页面在 Pages 文件夹中的代码。

using Team_Management_Hub;
using Team_Management_Hub.Pages;

namespace Team_Management_Hub.Pages
{
    public sealed partial class Home : Page
    {
        public Home()
        {
            this.InitializeComponent();
        }

        private void TestButton_Click(object sender, RoutedEventArgs e)
        {
            //Here is the button I want to be able to click to alter the visibility of the MTRadioButton
        }
    }
}

我已经找了几天有关如何访问父级 Shell 的示例或解释,但我似乎无法弄明白。应该注意的是,这是我在 Windows 10 中的第一个 UWP,我对 C# 还很陌生。

此外,如果它有帮助或相关,下面的代码位于 Shell.xaml.cs 文件中,我用来导航到各个页面。

private void HomeRadioButton_Click(object sender, RoutedEventArgs e)
{
    var frame = this.DataContext as Frame;
    Page page = frame?.Content as Page;

    if (page?.GetType() != typeof(Home))
    {
        frame.Navigate(typeof(Home));
    }
}

更新: 因此,我已经对提供的第一个答案进行了一些更改,而且我在 Shell.xaml 文件中的范围似乎有些不正确。

这是我的 Shell.xaml 文件:

<Page
x:Class="Team_Management_Hub.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Team_Management_Hub"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:pages="using:Team_Management_Hub.Pages"
mc:Ignorable="d">
<pages:Home MyCoolEvent="OnCoolEvent"/>;
<SplitView x:Name="Team_Management_Hub" Background="Black" OpenPaneLength="240" CompactPaneLength="48"
    DisplayMode="CompactOverlay" IsPaneOpen="False" PaneBackground="Gray" Content="{Binding}">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup>
            <VisualState x:Name="HardwareButtons">
                <VisualState.Setters>
                    <Setter Target="BackRadioButton.Visibility" Value="Collapsed" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <SplitView.Pane>
        <StackPanel x:Name="SplitViewPanePanel">
            <RadioButton x:Name="BackRadioButton" Click="BackRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE112;" Background="Gray" Content="Back" GroupName="Back"/>
            <RadioButton x:Name="HamburgerRadioButton" Click="HamburgerRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE700;" Content="Menu" />
            <RadioButton x:Name="HomeRadioButton" Click="HomeRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE80F;" Content="Home" GroupName="Navigation"/>
            <RadioButton x:Name="TARadioButton" Click="TARadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE179;" Content="Team Assignments" GroupName="Navigation"/>
            <RadioButton x:Name="ASRRadioButton" Click="ASRRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE13C;" Content="Assignment Switch Requests" GroupName="Navigation"/>
            <RadioButton x:Name="MTRadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="&#xE15E;" Content="Management Tools" GroupName="Navigation"/>
        </StackPanel>
    </SplitView.Pane>
</SplitView>

这样,<pages:Home MyCoolEvent="OnCoolEvent"/> 下的所有内容都带有蓝色下划线,错误 "the property Content is set more than once" 我找到了 this link,所以我尝试实现将它们全部放在一个网格中,但是当我简单地在 <SplitView> 上方和最终 [=20= 下方添加 <Grid> 时] 如果我将 <pages> 部分保留在拆分视图上方,则 Home.xaml 页面上的按钮不会执行任何操作。如果我将 <pages> 移动到 <SplitView> 下方但仍在 <Grid></Grid> 内,则按钮有效,但 SplitView 消失。我还尝试将 <pages> 放入包含我的 RadioButtons 的 <StackPanel> 中,但它做了一些奇怪的事情,我的主页出现在按钮下方的 SplitView 窗格内。所以,我确定我在 xaml 设置的范围内犯了一些简单的错误,但我已经尝试了很多将 <pages:Home> 放置在许多不同区域的组合在不同的控件中,我还没有让它工作。因此,如果能在适当的布局方面提供帮助以完成这项工作,那就太好了。

感谢您的帮助。

一种非常简单的方法是将活动添加到您的主页 class。单击 TestButton 时触发事件。然后,您将在 "shell" 页面上收听该事件。

示例 shell xaml:

<pages:Home MyCoolEvent="OnCoolEvent"/>

示例shell代码

private void OnCoolEvent(object sender, EventArgs args)
{
   //alter the visibility of the MTRadioButton
}

家庭代码:

public event EventHandler MyCoolEvent;

private void TestButton_Click(object sender, RoutedEventArgs e)
{
    OnMyCoolEvent();
}

protected virtual void OnMyCoolEvent()
{
    EventHandler handler = MyCoolEvent;
    if (handler != null) handler(this, EventArgs.Empty);
}