WinRT/C++获取Frame内Page的父Page控件
WinRT/C++ Get parent Page control of the Page inside the Frame
在使用 WinRT/C++ UI.
构建的桌面应用程序中从框架内的页面获取父页面控件的最佳方法
插图:
MainPage
^^Frame
^^SecondPage
^^Frame
^^ThirdPage
^^Keep going
那么,如何从SecondPage甚至ThirdPage开始获取MainPage控件。
您可以使用 VisualTreeHelper
导航可视化树。以下实现从 root
元素和 returns 与请求的 ancestor_type
元素匹配的元素开始可视化树,如果不存在则为空 com_ptr
匹配:
template <typename ancestor_type>
auto find_ancestor(::winrt::Windows::UI::Xaml::DependencyObject root) noexcept
{
auto ancestor { root.try_as<ancestor_type>() };
while (!ancestor && root)
{
root = ::winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetParent(root);
ancestor = root.try_as<ancestor_type>();
}
return ancestor;
}
您可以使用它从 Page
移动到 Page
,跳过中间的 Frame
,直到您到达树的顶部。
在使用 WinRT/C++ UI.
构建的桌面应用程序中从框架内的页面获取父页面控件的最佳方法插图:
MainPage
^^Frame
^^SecondPage
^^Frame
^^ThirdPage
^^Keep going
那么,如何从SecondPage甚至ThirdPage开始获取MainPage控件。
您可以使用 VisualTreeHelper
导航可视化树。以下实现从 root
元素和 returns 与请求的 ancestor_type
元素匹配的元素开始可视化树,如果不存在则为空 com_ptr
匹配:
template <typename ancestor_type>
auto find_ancestor(::winrt::Windows::UI::Xaml::DependencyObject root) noexcept
{
auto ancestor { root.try_as<ancestor_type>() };
while (!ancestor && root)
{
root = ::winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetParent(root);
ancestor = root.try_as<ancestor_type>();
}
return ancestor;
}
您可以使用它从 Page
移动到 Page
,跳过中间的 Frame
,直到您到达树的顶部。