【问题标题】:How can I have a child Page manipulate its parent Page's properties, UI elements, and methods?如何让子页面操纵其父页面的属性、UI 元素和方法?
【发布时间】:2019-03-25 10:22:10
【问题描述】:

我的父页面上有一个工具栏。然后它有一个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>

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

【问题讨论】:

  • 因此,如果您在子页面中获得父页面的实例,您将能够访问它的公共属性..这是您要求的吗?
  • 嗯,我知道有一些方法可以访问父母的数据。我只是想知道这样做是否合适,如果有的话,哪种方法最合适。
  • 我认为的另一种方法是,如果您有 ParentViewModel 的实例,而不是子视图中的父视图实例,这可能是更新父控件状态的最佳方法。但是由于我不确定您要更新哪些元素以及是否要实现此目的,您可能需要更改您的 xaml - 例如将一些元素绑定到 ViewModel 属性并需要做一些额外的事情。但到目前为止,我认为这始终是一个好方法。
  • 使用代码隐藏的方法从子级更新父级中的某些内容并没有错,方法是在子级中有一个视图实例。但希望您确保将相同的实例传递给孩子,以便更改能够反映出来。

标签: c# wpf xaml mvvm uwp


【解决方案1】:

创建一个“Shell”页面是很常见的,它包含一个应用程序范围的导航结构,并有一个Frame,其中实际上显示了您的应用程序的内容。

有很多方法可以从页面与 shell 进行通信。最简单的解决方案是在返回当前实例的 shell 中提供 public static 方法。假设shell页面被称为ShellPage,那么方法应该是这样的

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

对此有几个考虑:

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

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 2013-07-24
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多