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

时间:2015-08-20 19:03:54

标签: c# xaml winrt-xaml uwp

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

我的层次结构如下: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>

以下是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"/>下的所有内容都会加下划线蓝色,错误“属性内容设置多次” 我找到了this链接,因此我尝试将其全部放入网格中,但是如果我保留的话,我只需在<Grid>上方添加<SplitView>,在最后</SplitView>下方添加<pages>在splitview上方的<pages>部分,Home.xaml页面上的按钮不执行任何操作。如果我将<SplitView>移动到<Grid></Grid>以下,但仍在<pages>按钮内,但SplitView会消失。我还尝试将<StackPanel>扔到保存我的RadioButtons的<pages:Home>内,但它做了一些奇怪的事情,看起来我的主页位于按钮下的SplitView窗格内。所以,我确信我在xaml设置的范围内有一些简单的错误,但是我已经尝试了很多将KettleClientEnvironment.init(); TransMeta metaData = new TransMeta("C:\\examplepath\\test.ktr"); Trans transformation = new Trans(metaData); transformation.execute(null); transformation.waitUntilFinished(); ... 放在很多不同区域和不同控件内的组合,我没有得到它的工作。因此,在正确的布局上提供一些帮助可以很好地完成这项工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

一种非常简单的方法是向您的Home类添加一个事件。单击TestButton时触发事件。然后你会在你的&#34; shell&#34;上听你的活动。页。

示例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);
}