gpt4 book ai didi

uwp - 如何在代码中创建 XAML 自定义控件?

转载 作者:行者123 更新时间:2023-12-04 02:44:31 24 4
gpt4 key购买 nike

我正在尝试使用 C++/WinRT 在代码中实现自定义 XAML 控件。但是,我尝试的实现未能编译。作为概念证明,我使用了以下代码:

#pragma once

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

namespace MyApp
{
struct MyControl : winrt::implements<MyControl, winrt::Windows::UI::Xaml::Controls::Control>
{
};
}

这导致以下编译器错误:

1>MyControl.cpp
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(6416): error C2079: 'winrt::impl::producer<D,winrt::Windows::UI::Xaml::Controls::Control,void>::vtable' uses undefined struct 'winrt::impl::produce<D,I>'
1> with
1> [
1> D=MyApp::MyControl
1> ]
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(7163): note: see reference to class template instantiation 'winrt::impl::producer<D,winrt::Windows::UI::Xaml::Controls::Control,void>' being compiled
1> with
1> [
1> D=MyApp::MyControl
1> ]
1>c:\xxx\mycontrol.h(8): note: see reference to class template instantiation 'winrt::implements<MyApp::MyControl,winrt::Windows::UI::Xaml::Controls::Control>' being compiled


我无法理解编译器错误。显然,您无法像实现其他类型以供 Windows 运行时使用一样实现 XAML 控件。

在代码中实现 XAML 自定义控件需要什么?

最佳答案

WinRT 中的“继承”或“子类化”与 C++ 继承略有不同。因为这些是 COM 接口(interface),所以当您子类化 WinRT 运行时类时,您真正要做的是 COM Aggregation ,结合实现基类型的 overridable interfaces .由于 COM 聚合方面,这比标准 C++ 继承要麻烦得多,还有所有委托(delegate)/非委托(delegate)、特殊构造等。这将是 WRL 中的一个主要痛苦,但 C++/CX 在下面做了一堆编译器魔法将其抽象出来的引擎盖。幸运的是,C++/WinRT 可以帮助您提供两种类型的抽象,而无需求助于无形的魔法。

如果您正在创作不需要在外部可见的类型(例如,应用程序,而不是运行时组件),C++/WinRT 为此提供了方便的帮助器:

#pragma once

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

namespace MyApp
{
struct MyControl : winrt::Windows::UI::Xaml::Controls::ControlT<MyControl>
{
void OnTapped(winrt::Windows::UI::Xaml::Input::TappedRoutedEventArgs const&);
};
}

此基础类型 ControlT将正确构建聚合基 Control实例并将基方法委托(delegate)给它,同时还实现“可覆盖”接口(interface)。这些可重写的方法都有一个占位符实现,默认调用基方法,但您可以自己重写它们并获得您的自定义行为。

另一方面,如果您需要通过 IDL 创建一个投影类型:
namespace MyApp
{
[default_interface]
runtimeclass MyControl : Windows.UI.Xaml.Controls.Control
{
MyControl();
};
}

这将生成与内置 ControlT 类似的脚手架。上面的案例,还可以转换您的类型。事实上,如果你检查这个类型的生成文件(在这个例子中是 MyControl.g.h),你会看到一个 MyControlT这一切都被联系起来了。

(注意: [default_interface] 属性只有在你有一个空的、可构造的、密封的运行时类时才需要。一旦你添加了成员​​,midl 将在没有任何其他哄骗的情况下合成默认接口(interface)。

关于uwp - 如何在代码中创建 XAML 自定义控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50824870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com