从父 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="" Background="Gray" Content="Back" GroupName="Back"/>
<RadioButton x:Name="HamburgerRadioButton"
Click="HamburgerRadioButton_Click"
Style="{StaticResource NavRadioButtonStyle}"
Tag=""
Content="Menu" />
<RadioButton x:Name="HomeRadioButton" Click="HomeRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Home" GroupName="Navigation"/>
<RadioButton x:Name="TARadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Team Assignments" GroupName="Navigation"/>
<RadioButton x:Name="ASRRadioButton" Click="ASRRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Assignment Switch Requests" GroupName="Navigation"/>
<RadioButton x:Name="MTRadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" 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="" Background="Gray" Content="Back" GroupName="Back"/>
<RadioButton x:Name="HamburgerRadioButton" Click="HamburgerRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Menu" />
<RadioButton x:Name="HomeRadioButton" Click="HomeRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Home" GroupName="Navigation"/>
<RadioButton x:Name="TARadioButton" Click="TARadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Team Assignments" GroupName="Navigation"/>
<RadioButton x:Name="ASRRadioButton" Click="ASRRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Assignment Switch Requests" GroupName="Navigation"/>
<RadioButton x:Name="MTRadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" 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);
}
我正在使用 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="" Background="Gray" Content="Back" GroupName="Back"/>
<RadioButton x:Name="HamburgerRadioButton"
Click="HamburgerRadioButton_Click"
Style="{StaticResource NavRadioButtonStyle}"
Tag=""
Content="Menu" />
<RadioButton x:Name="HomeRadioButton" Click="HomeRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Home" GroupName="Navigation"/>
<RadioButton x:Name="TARadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Team Assignments" GroupName="Navigation"/>
<RadioButton x:Name="ASRRadioButton" Click="ASRRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Assignment Switch Requests" GroupName="Navigation"/>
<RadioButton x:Name="MTRadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" 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="" Background="Gray" Content="Back" GroupName="Back"/>
<RadioButton x:Name="HamburgerRadioButton" Click="HamburgerRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Menu" />
<RadioButton x:Name="HomeRadioButton" Click="HomeRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Home" GroupName="Navigation"/>
<RadioButton x:Name="TARadioButton" Click="TARadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Team Assignments" GroupName="Navigation"/>
<RadioButton x:Name="ASRRadioButton" Click="ASRRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" Content="Assignment Switch Requests" GroupName="Navigation"/>
<RadioButton x:Name="MTRadioButton" Click="MTRadioButton_Click" Style="{StaticResource NavRadioButtonStyle}" Tag="" 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);
}