在C++/WinRT中,如何获取WinUI/UWP任意FrameworkElement的具体类型名?
在C++/WinRT中获取FrameworkElement的实际类型名及调试信息方案
核心需求
处理可视化树中未知类型的FrameworkElement时,获取其具体类型名称,并解决Visual Studio调试器信息不足的问题。
获取实际类型名称的方法
使用C++/WinRT内置的winrt::get_class_name函数,可直接获取对象的完全限定类型名称(如Microsoft.UI.Xaml.Controls.Button)。
代码示例
#include <winrt/Windows.Foundation.h> #include <winrt/Microsoft.UI.Xaml.h> #include <Windows.h> // 用于OutputDebugStringW #include <string> void DoSomethingWithElement(winrt::FrameworkElement const& current) { // 获取元素的实际类型名称 std::wstring typeName = winrt::get_class_name(current); // 输出到调试窗口(Visual Studio的“输出”面板可查看) OutputDebugStringW((L"当前元素类型: " + typeName + L"\n").c_str()); // 可选:输出到控制台(桌面应用适用) // std::wcout << L"当前元素类型: " << typeName << std::endl; }
调试时获取更多信息的技巧
调试器查看实际类型
在Visual Studio的“局部变量”窗口中,展开current对象,查看__winrt_interface字段,或启用“动态视图”(若支持),可直接看到对象的实际类型。修复命令窗口成员调用问题
命令窗口中直接调用current.IsLoaded()报错,是因为IsLoaded是Control类的成员,而非FrameworkElement。需先转换类型再调用:? current.as<Microsoft::UI::Xaml::Controls::Control>().IsLoaded()若不确定类型,可先在命令窗口获取类型名:
? winrt::get_class_name(current)条件转换调用特定成员
若需针对特定类型做处理,可使用try_as安全转换:if (auto button = current.try_as<winrt::Microsoft::UI::Xaml::Controls::Button>()) { // 调用Button的专属成员 auto buttonContent = button.Content(); }
内容的提问来源于stack exchange,提问作者citelao
相关产品推荐
相关产品推荐

