将winrt :: UI :: Xaml :: Controls :: TextBlock对象转换为C ++ / CX对象

n

我将项目从C ++ / CX移植到C ++ / WinRT。为此,我需要执行一些互操作操作,例如:https : //docs.microsoft.com/zh-cn/windows/uwp/cpp-and-winrt-apis/interop-winrt-cx

Microsoft建议使用此类辅助功能以实现互操作性。

from_cx和to_cx函数下面的帮助器函数将C ++ / CX对象转换为等效的C ++ / WinRT对象。该函数将C ++ / CX对象强制转换为其基础IUnknown接口指针。然后,它在该指针上调用QueryInterface,以查询C ++ / WinRT对象的默认接口。QueryInterface是Windows运行时应用程序二进制接口(ABI)的等效C ++ / CX safe_cast扩展。而且,winrt :: put_abi函数检索C ++ / WinRT对象的基础IUnknown接口指针的地址,以便可以将其设置为另一个值。

template <typename T>
T from_cx(Platform::Object^ from)
{
    T to{ nullptr };

    winrt::check_hresult(reinterpret_cast<::IUnknown*>(from)
        ->QueryInterface(winrt::guid_of<T>(),
            reinterpret_cast<void**>(winrt::put_abi(to))));

    return to;
}

下面的帮助器函数将C ++ / WinRT对象转换为等效的C ++ / CX对象。winrt :: get_abi函数检索指向C ++ / WinRT对象的基础IUnknown接口的指针。该函数在使用C ++ / CX safe_cast扩展名查询所请求的C ++ / CX类型之前,将该指针强制转换为C ++ / CX对象。

template <typename T>
T^ to_cx(winrt::Windows::Foundation::IUnknown const& from)
{
    return safe_cast<T^>(reinterpret_cast<Platform::Object^>(winrt::get_abi(from)));
}

但是,当我做这样的事情时:

auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
Windows::UI::Xaml::FrameworkElement^ cx = to_cx<Windows::UI::Xaml::FrameworkElement^>(text);

我收到一个错误:

没有函数模板“ to_cx”的实例与参数列表匹配

参数类型为:(winrt :: Windows :: UI :: Xanl :: Controls :: TextBlock)

但是我确实看到TextBlock继承自IUnknown。我想念什么?

Nico Zhu - MSFT

将winrt :: UI :: Xaml :: Controls :: TextBlock对象转换为C ++ / CX对象

如果你想端口一个C ++ / WinRT的对象到C ++ / CX对象。您可以为该解决方案制作Windows Runtime Component(C ++ / WinRT)项目,然后将转换代码放入其中。然后,使C ++ / WinRT项目引用上述组件(在解决方案资源管理器中右键单击C ++ / WinRT项目名称,单击“添加”,选择“引用”,在“添加引用”对话框的“项目”下选择刚添加的组件名称)。

注意

您需要在Windows运行时组件(C ++ / WinRT)项目而不是C ++ / WinRT项目中使用Consume Windows Runtime Extension>是(/ ZM)

然后,在Windows运行时组件(C ++ / WinRT)中,添加cx名称空间和winrt名称空间以使用不同的语言来区分不同的对象。

可以将以下代码放入您的组件项目的类中。

添加所需的标题,例如:

#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.h>

In the cx namespace, add  using statements:
namespace cx
{
    using namespace Windows::Foundation;
    using namespace Windows::UI::Xaml;
}

// And, in the winrt namespace, add the needed using statements:

namespace winrt
{
    using namespace Windows;
    using namespace Windows::ApplicationModel::Core;
    using namespace Windows::Foundation;
    using namespace Windows::Foundation::Numerics;
    using namespace Windows::UI;
    using namespace Windows::UI::Core;
    using namespace Windows::UI::Composition;
    using namespace winrt::Windows::UI::Xaml::Controls;
    using namespace winrt::Windows::UI::Xaml;
}
Add the to_cx method:
template <typename T>
T^ to_cx(winrt::Windows::Foundation::IUnknown const& from)
{
    return safe_cast<T^>(reinterpret_cast<Platform::Object^>(winrt::get_abi(from)));
}

//Change the code:

/*auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
Windows::UI::Xaml::FrameworkElement^ cx = to_cx<Windows::UI::Xaml::FrameworkElement^>(text);*/

auto text = winrt::Windows::UI::Xaml::Controls::TextBlock();
        cx::FrameworkElement^ cx = to_cx<cx::FrameworkElement>(text);

请注意 :

请不要将转换代码放入XAML页面,因为您的XAML页面类型必须完全是C ++ / CX或完全是C ++ / WinRT。您可以在同一项目中的XAML页面类型之外混合使用C ++ / CX和C ++ / WinRT。

必须首先在类的idl文件中声明在组件项目的类中使用转换代码的函数,否则我们不能在另一个项目中引用该函数。

更新:

这是我创建的一个简单示例,单击主项目中的按钮时,我调用Windows Runtime Component的方法来触发to_cx方法,可以对其进行检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法将字符串转换为Windows.UI.Xaml.Controls.IconElement

来自分类Dev

无法将字符串转换为Windows.UI.Xaml.Controls.IconElement

来自分类Dev

将特定的Run添加到Windows.UI.Xaml.Controls.TextBlock后,如何以编程方式访问它?

来自分类Dev

没有重载函数winrt :: Windows :: UI :: Xaml :: Controls :: Primitives :: SelectorItem :: Content的实例与参数列表匹配

来自分类Dev

如何将C ++ / CX运行时对象转换为本机C指针类型?

来自分类Dev

在C ++ / CX中绑定到Windows :: UI :: Xaml :: GridLength

来自分类Dev

'无法将类型为'System.String'的对象转换为类型'System.Windows.Controls.ComboBoxItem

来自分类Dev

无法将类型为“ System.Windows.Controls.Grid”的对象转换为类型为“ System.Windows.Shapes.Ellipse”的对象?

来自分类Dev

C ++将json转换为对象

来自分类Dev

将PyObject *转换为C ++对象

来自分类Dev

将XML转换为C#对象

来自分类Dev

将json转换为c#对象

来自分类Dev

在XAML中传递XAML对象

来自分类Dev

将C#对象转换为JSON或Javascript对象

来自分类Dev

无法将大型Javascript对象转换为C#对象

来自分类Dev

将C#对象转换为Json对象

来自分类Dev

如何将C#对象转换为JSON对象

来自分类Dev

将Javascript对象转换为C#对象

来自分类Dev

无法将大型Javascript对象转换为C#对象

来自分类Dev

无法将类型'string'隐式转换为'Windows.UI.Xaml.Media.Imaging.BitmapImage

来自分类Dev

将字节 [] 转换为 Windows.UI.Xaml.Media.Imaging.BitmapImage

来自分类Dev

如何将“枚举”转换为XAML矢量图标对象并在同一窗口中多次显示?

来自分类Dev

将SVG转换为XAML

来自分类Dev

Swift:将NSObject强制转换为其他类型的UI对象

来自分类Dev

如何将类型为“ System.Web.UI.WebControls.Label”的对象转换为类型为“ System.IConvertible”的对象

来自分类Dev

将System.Windows.Controls.Image加载到WritableBitmap对象

来自分类Dev

HtmlAgilityPack-将HTML转换为XAML并绑定到RichTextBox / TextBlock吗?

来自分类Dev

将C ++对象的C ++矢量转换为mex中的mxArray

来自分类Dev

将数组转换为对象

Related 相关文章

  1. 1

    无法将字符串转换为Windows.UI.Xaml.Controls.IconElement

  2. 2

    无法将字符串转换为Windows.UI.Xaml.Controls.IconElement

  3. 3

    将特定的Run添加到Windows.UI.Xaml.Controls.TextBlock后,如何以编程方式访问它?

  4. 4

    没有重载函数winrt :: Windows :: UI :: Xaml :: Controls :: Primitives :: SelectorItem :: Content的实例与参数列表匹配

  5. 5

    如何将C ++ / CX运行时对象转换为本机C指针类型?

  6. 6

    在C ++ / CX中绑定到Windows :: UI :: Xaml :: GridLength

  7. 7

    '无法将类型为'System.String'的对象转换为类型'System.Windows.Controls.ComboBoxItem

  8. 8

    无法将类型为“ System.Windows.Controls.Grid”的对象转换为类型为“ System.Windows.Shapes.Ellipse”的对象?

  9. 9

    C ++将json转换为对象

  10. 10

    将PyObject *转换为C ++对象

  11. 11

    将XML转换为C#对象

  12. 12

    将json转换为c#对象

  13. 13

    在XAML中传递XAML对象

  14. 14

    将C#对象转换为JSON或Javascript对象

  15. 15

    无法将大型Javascript对象转换为C#对象

  16. 16

    将C#对象转换为Json对象

  17. 17

    如何将C#对象转换为JSON对象

  18. 18

    将Javascript对象转换为C#对象

  19. 19

    无法将大型Javascript对象转换为C#对象

  20. 20

    无法将类型'string'隐式转换为'Windows.UI.Xaml.Media.Imaging.BitmapImage

  21. 21

    将字节 [] 转换为 Windows.UI.Xaml.Media.Imaging.BitmapImage

  22. 22

    如何将“枚举”转换为XAML矢量图标对象并在同一窗口中多次显示?

  23. 23

    将SVG转换为XAML

  24. 24

    Swift:将NSObject强制转换为其他类型的UI对象

  25. 25

    如何将类型为“ System.Web.UI.WebControls.Label”的对象转换为类型为“ System.IConvertible”的对象

  26. 26

    将System.Windows.Controls.Image加载到WritableBitmap对象

  27. 27

    HtmlAgilityPack-将HTML转换为XAML并绑定到RichTextBox / TextBlock吗?

  28. 28

    将C ++对象的C ++矢量转换为mex中的mxArray

  29. 29

    将数组转换为对象

热门标签

归档