我有一个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。我会错过什么吗?
先谢谢你的帮助,
此致
答案 0 :(得分:3)
FindName
仅返回当前控件的直接子元素。它不是递归地通过所有后代来找到匹配。
调试此类问题时,您可以使用“实时可视树”,以便轻松找到XAML控件的组织方式:
由于您的SplitView
已经被命名并且可以从后面的代码中访问,因此您可以直接使用它。
如果你在另一个控件中,你可以通过一个属性公开它,或者从一个孩子到另一个孩子进行递归搜索。
答案 1 :(得分:2)
Frame
是一个具有导航历史记录,背书等的对象。应用程序的窗口有一个内容元素,通常是您提到的Frame。但是帧本身也有一个内容元素,它是此帧中显示的当前Page
(或一般FrameworkElement
)。因此,要获得currentPage
,您需要执行以下操作:
var parentPage = (Page)((Frame)Window.Current.Content).Content;