UWP FindName返回null

时间:2017-01-19 12:05:34

标签: uwp uwp-xaml

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

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

在这个SplitView中,我有一个包含ListView用于导航的usercontrol,当单击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");

始终返回null。我会错过什么吗?

先谢谢你的帮助,

此致

2 个答案:

答案 0 :(得分:3)

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

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

live visual tree

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

答案 1 :(得分:2)

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

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