如何让子页面操纵其父页面的属性,UI元素和方法?

时间:2018-10-20 22:58:09

标签: c# wpf xaml mvvm uwp

我的父页面上有一个工具栏。然后,在加载子页面的工具栏下有一个Frame元素。是否有“正确”的方式可以从我导航到的子页面中操纵位于父页面中的工具栏?父页面还具有我也要操纵的其他属性。

<Page>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition x:Name="ToolbarRowDefinition" Height="46" />
            <RowDefinition x:Name="ContentRowDefinition" Height="*" />
        </Grid.RowDefinitions>

        <local:MyToolbar x:Name="Toolbar"
                         Grid.Row="0" />

        <Frame x:Name="ChildFrame"
               Grid.Row="1" />
    </Grid>
</Page>

我不认为尝试这样做不是一个坏主意,因为我不知道有任何反对的规则。所有这些都位于视图内,因此我认为尝试从其他视图内访问其他视图级别的元素,方法和属性没有问题。如果我错了,请纠正我。谢谢!

1 个答案:

答案 0 :(得分:0)

通常会创建一个“ Shell”页面,其中包含一个应用程序范围的导航结构,并在其中包含一个Frame,实际上可以显示您的应用程序内容。

有很多方法可以通过页面与Shell进行通信。最简单的解决方案是在外壳程序中提供一个public static方法来返回当前实例。假设外壳页面名为ShellPage,则该方法将如下所示

public static ShellPage GetForCurrentView() => (ShellPage)Window.Current.Content;

对此有几个注意事项:

  • 只能从UI线程调用此方法,但该方法与UWP API的许多部分一致,即使您的应用程序具有多个视图或窗口,该方法也将起作用-它将始终返回ShellPage请求来自的窗口。
  • 代码假定ShellPageWindow的主要内容。这不是默认设置,因为默认情况下,App.xaml.cs中的OnLaunched方法将根目录内容设置为Frame,然后将其导航到MainPage。覆盖此行为并将ShellPage设置为窗口的根是完全可以的。如果您不想这样做,则必须将上面的代码更改为(ShellPage)((Frame)Window.Current.Content).Content
  • 如果您想拥有多个视图,而有些视图可能没有ShellPage,则可能需要更新代码以使用as以确保获取的是null而不是如果ShellPage不存在,则为例外。但这确实取决于您的特定情况。