【问题标题】:UWP FindName return nullUWP FindName 返回 null
【发布时间】:2017-01-19 12:05:33
【问题描述】:

我有一个 UWP 应用,其 MainPage 包含一个名为 Splitview 的 SplitView:

<SplitView x:Name="SplitView" ...>

在这个 SplitView 中,我有一个包含用于导航的 ListView 的用户控件,当单击 ListViewItem 时,我导航到另一个页面,但我想在导航之前关闭 SplitView 的窗格。因此,在 ListeView itemclick 事件后面的用户控件代码中,我访问父框架,然后尝试使用 FindName 访问 SplitView 并关闭它:

var parentPage = ((Frame)Window.Current.Content);
if (parentPage != null)
{
    SplitView splitview = (SplitView)parentPage.FindName("SplitView");
    splitview.IsPaneOpen = false;
}

parentPage 对 MainPage 有很好的参考,但是这一行:

SplitView splitview = (SplitView)parentPage.FindName("SplitView");

总是返回空值。我会错过什么吗?

提前感谢您的帮助,

问候

【问题讨论】:

  • 我有点困惑,当变量名暗示Page 时,为什么parentPage 的类型是Frame?这是Frame 还是Page
  • 这确实是我的错误:它是一个框架,我应该将它用作一个页面。 :)

标签: uwp uwp-xaml


【解决方案1】:

FindName 仅从当前控件的直接子元素返回元素。它不是递归地遍历所有后代来找到匹配项。

在调试此类问题时,您可以使用“实时可视化树”,让您轻松找到 XAML 控件的组织方式:

由于您的SplitView 已经命名并可以从后面的代码访问,您可以直接使用它。 如果您在另一个控件中,则可以通过属性公开它或执行从子到子的递归搜索。

【讨论】:

    【解决方案2】:

    Frame 是一个具有导航历史、backstack 等的对象。应用程序的窗口有一个内容元素,通常是您提到的 Frame。但是 Frame 本身也有一个内容元素,也就是当前 Frame 中显示的 Page(或一般的 FrameworkElement)。因此,要获取您的 currentPage,您需要执行以下操作:

    var parentPage = (Page)((Frame)Window.Current.Content).Content;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 2020-09-28
      • 2018-11-03
      • 2017-05-10
      • 1970-01-01
      • 2019-02-11
      • 2018-02-16
      • 2021-03-13
      相关资源
      最近更新 更多