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,直到您到达树的顶部。