问题标签 [c++-winrt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
95 浏览

winrt-xaml - 从 ComboBox 获取 ComboBoxItem

在我的通用 Windows 应用程序中,我有以下“xaml”:

现在我需要遍历我的组合框并获取组合框项目以禁用其中一些。如何从后面的代码中访问项目?

0 投票
1 回答
349 浏览

c++-winrt - 如何使用 cppwinrt 为 OnPointerEntered 声明处理程序?

在 cppwinrt(xaml 尚不可用)中,我有一个按钮的 PointerEntered 事件的处理程序,它工作正常。但是在尝试删除显示为图像的此按钮的默认悬停行为时,似乎我可能需要处理 OnPointerEntered 事件 - 我已经看到涉及使用 xaml 触发器的解决方案,这似乎是一个等效的代码. 但是 OnPointerEntered 有一个不同的参数列表,我找不到调用它的方法来构建它。下面是如何成功声明 PointerEntered 事件句柄:

这会构建并正确调用 EnteredButton。但

不会构建 - 在尝试了多种变体之后,我错误地声明了它,但不确定如何构建。(使用完全限定的名称可能不是必需的,但在任何一种情况下似乎都没有伤害)。cppwinrt中是否可以使用OnPointerEntered,如果可以,如何声明?我尝试使用 IPointerRoutedEventArgs 而不是 PointerRoutedEventArgs 没有效果。或者 - 如果有人知道在使用 cppwinrt 创建的按钮中禁用悬停效果的不同方法,那将起作用。

0 投票
3 回答
1009 浏览

c++-winrt - 如何初始化 cppwinrt TimeSpan 结构?

根据 cppwinrt 的主文档迁移 C++...,“用于设置 Windows 运行时属性值的等效 C++/WinRT 源代码调用与 Windows 运行时属性同名的方法和新值的参数:

但这在尝试设置 Duration 对象的 TimeSpan 属性时似乎不起作用:

第三行在“持续时间”上产生智能感知错误:“调用没有适当运算符或转换函数到函数指针类型的类类型对象。” 同一行的构建错误是“术语不评估为采用 1 个参数的函数”。我应该补充一点,Duration 的构造函数似乎有一个参数,一个 TimeSpan,但这也不被接受。使用 cppwinrt 时如何设置 Duration 的 TimeSpan 属性?

0 投票
1 回答
708 浏览

c++ - 如何在 c++/winrt UWP 应用程序中使用 SVG 图像?

我已经能够在我的 UWP 应用程序中使用 C++/WinRT 以编程方式显示位图图像,但是我无法让 SVG 图像工作。

下面是我能想到的最简单的例子。我创建一个应用程序,加载一个 SVG 图像,将其添加到应用程序窗口并激活该窗口。我在下面提供了源代码和 SVG 文件。

几点注意事项:

  • 应用程序运行,只是没有显示图像
  • 我确保 SVG 文件符合Windows 中支持的功能
  • 该文件位于我的项目根文件夹中
  • 以类似的方式加载位图没有问题
  • 我尝试使用 OpenFailed 方法进行故障排除,但它提供的信息无用

来源


样本.svg

0 投票
1 回答
475 浏览

c++-winrt - 如何在 cppwinrt 中访问 DeviceInformation 类的成员?

winrt MIDI 文档示例代码建议,给定一个 DeviceInformation 对象,可以通过引用 DeviceInformation 的 Id 创建一个 MIDIPort,如下所示,对于名为 devInfo 的 DeviceInformation:

midiOutPort = 等待 MidiOutPort.FromIdAsync(devInfo.Id);

当然,在 cppwinrt 中,人们会使用它的 C++ 版本,但症结在于访问 devInfo 的 Id(无论是通过 devInfo.Id() 还是 devInfo.Id 或其他)。错误是“DeviceInformation 没有名为 Id 的成员”。这肯定存在于 cppwinrt 中,但我还没有找到访问它的方法。

如果相关,我以这种方式声明了 DeviceInformation:

因为在枚举 DeviceInformationCollection 时未接受 winrt::Windows::Devices::Enumeration::DeviceInformation。

0 投票
1 回答
387 浏览

c++ - 使用 C++/WinRT 用设备填充列表框,显示它们的名称?

我有一个 DeviceSelector 类,它显示要选择的设备列表。我想以编程方式执行此操作,而不使用 XAML 文件。由于我发现很难从 C++ 中正确使用 ListBox 控件,因此我有以下问题:

  • 如何正确使用该属性在 ListBoxDisplayMemberPath中显示该属性?Name应该传入属性的路径,但由于某种原因,这似乎在我的程序中不起作用。
  • 是否可以使用该ItemsSource属性使用 Collection 填充 ListBox?从文档中不清楚将什么作为参数传递,并且没有那么多非 XAML C++ 示例。

下面我有我简化的 DeviceSelector 类,并提供了一个简单的应用程序用于故障排除。

编辑1:

DisplayMemberPath 没有像我期望的那样工作,并不是特定于 C++/WinRT。我尝试使用 XAML 和后面的代码来实现它,使用:

用设备填充 ListBox 后,它也不显示名称。


设备选择器.h


设备选择器.cpp


主文件


pch.h

0 投票
1 回答
292 浏览

c++-winrt - 如何在 2018 年 10 月枚举文件夹内容

尝试将 StorageFolder 方法 GetFilesAsync 转换为 cppwinrt 我无法解决过去的编译器链接错误。这是一个非常简单的例程来测试这个概念:

问题似乎在于 GetFilesAsync 的返回类型。我为此尝试了各种类型,例如IVectorView,但似乎没有任何效果。有谁知道显示如何在 C++/winrt 中完成此枚举的代码示例?

[更新] 使用 SDK 10.0.17666 和 VS 15.9.0 Preview 3 回到这个项目,我发现之前从这些答案中采用的解决方案不再有效。这次我一定会包括完整的错误,看看是否有人有想法。为简单起见,我将仅使用 IInspectable 提供的简单代码,仅对其进行更改以使其成为 ResourceManager 类中的类成员:

对 GetFilesAsync 的调用现在会产生以下链接错误:严重性代码描述项目文件行抑制状态错误 LNK2019 未解析的外部符号“public: struct winrt::Windows::Foundation::IAsyncOperation > __thiscall winrt::impl::consume_Windows_Storage_Search_IStorageFolderQueryOperations::GetFilesAsync (枚举 winrt::Windows::Storage::Search::CommonFileQuery const &)const " (?GetFilesAsync@?$consume_Windows_Storage_Search_IStorageFolderQueryOperations@UStorageFolder@Storage@Windows@winrt@@@impl@winrt@@QBE?AU?$IAsyncOperation@ U?$IVectorView@UStorageFile@Storage@Windows@winrt@@@Collections@Foundation@Windows@winrt@@@Foundation@Windows@3@ABW4CommonFileQuery@Search@Storage@63@@Z) 在函数“public: struct winrt”中引用::Windows::Foundation::IAsyncAction __thiscall AppEngine::ResourceManager::LoadActivities$_ResumeCoro$2(void)" (?LoadActivities$_ResumeCoro$2@ResourceManager@AppEngine@@QAE?AUIAsyncAction@Foundation@Windows@winrt@@XZ)

(后跟目标文件的路径)

我不得不承认我发现这个错误信息很难破译。也许这里的其他人会有一个想法?一定是在最近的系统更新中发生了变化。

0 投票
1 回答
193 浏览

c++-winrt - C++/WinRT 是否需要安装 Windows 10 的 Windows Insider Preview 版本?

C++/WinRT 公告指出“这也意味着您不再需要等待我们在新的 Windows SDK 发布后更新 GitHub。事实上,我们将不再在 GitHub 上发布更新的标头,因为您可以直接从 Windows SDK 获取。”

但是,如果进一步单击一下,就会发现“SDK 的 Windows 10 Preview Build [is] to be used with Windows 10 Insider Preview (Build 17025 or greater)”和“Installation on an operating system that is not a Windows 10 Insider Preview 版本不受支持,可能会失败。”

现在必须安装 Windows 10 的 Windows Insider Preview 吗?这要么是一个可怕而漫长的过程,要么是完全不可能的,这取决于一个人的管理员权限。

或者可以抓住 SDK 并在具有标准 Windows 10 构建的盒子上使用 C++/WinRT 位吗?

对于 C++/WinRT 工具链的某些方面,最简单的路线仍然是 GitHub 吗?

如果一个人在非 Windows-10 机器上开发,例如 Windows 7,怎么样?数以百万计的商业开发人员处于这种情况,并且无法控制。

情况会改变吗?如果改变什么时候?

展望未来,是否会等待 SDK 预览的定期更新,如果是,如何使用它们?

0 投票
1 回答
561 浏览

c++ - 如何在 C++/WinRT 中获取底层类型的 TypeName?

我正在尝试实现该ICustomPropertyProvider::Type()方法,但是我找不到获取TypeNameC++/WinRT 类型的方法。显然你在 C++/CX 中有Object::GetTypeand T::typeid,但在 C++/WinRT 中没有。

我尝试了以下代码,但这只是一个疯狂的猜测,因为它是我能找到的唯一与类型有远程关系的东西。然而,我认为typeid()与 XAML 无关,因为它提供的唯一保证是它返回的字符串是唯一标识的。

0 投票
2 回答
1520 浏览

c++-winrt - 如何从 cppwinrt 中的 StorageFile 读取字节数据?

StackOverflow 上的 2012 年回答(“我如何在 Windows 应用商店应用程序中读取二进制文件”)建议使用这种从 Windows 应用商店应用程序中的 StorageFile 读取字节数据的方法:

这看起来很简单。当我在 cppwinrt 中工作时,我已将其翻译为以下内容,在生成 StorageFiles 向量的同一个 IAsyncAction 中。首先,我使用 theFilesVector.GetAt(index) 从 VectorView 获取一个 StorageFile;

//然后这一行编译没有错误:

//但是我找不到使缓冲区调用起作用的方法。

“byte[]”一开始就不能工作,所以我把它改成byte*,但是错误是“class 'winrt::Windows::Storage::Streams::IBuffer' has no member 'ToArray' ”</p>

事实上,Intellisense 没有为 IBuffer 列出这样的成员。然而 IBuffer 被指定为 ReadBufferAsync 的返回类型。上面的示例代码似乎无法正常运行。

在 FileIO 的文档中,我发现建议使用 DataReader 从缓冲区中读取,在 cppwinrt 中应该看起来像

编译。然后应该可以使用以下 DataReader 方法读取字节,幸运的是,该方法在 UWP 文档中以 cppwinrt 形式提供:

但是,这不会编译,因为在 cppwinrt 中无法识别 Byte 类型。如果我改为创建一个字节数组:

这是不被接受的。错误是

uint8_t 当然是一个字节,所以我们试试

这是错误的——显然我们确实需要创建一个 winrt::array_view。然而,2015 年 Reddit 的一篇帖子说 array_view “死了”,我不确定如何声明它,或者它是否会有所帮助。回想起来,从缓冲区读取字节的原始单行方法看起来非常漂亮。这是一篇很长的文章,但是任何人都可以建议从 cppwinrt 中的 StorageFile 引用中简单地读取原始字节的最佳当前方法吗?如果 StorageFile 上只有 GetFileBytes() 和 GetFileBytesAsync() 方法,那就太好了。

---更新:这是向前迈出的一步。去年我发现 Kenny Kerr 的评论解释说 array_view 不应该直接声明,但可以使用 std::vector 或 std::array 代替。这被接受为 DataReader 的 ReadBytes 方法的参数:

现在唯一的麻烦是 std::vector 没有接收任何字节,即使引用文件的大小在 buffer.Length() 中正确返回为 167,513 字节。这似乎表明缓冲区很好,所以我不确定为什么应用于该缓冲区的 ReadBytes 方法不会产生任何数据。

更新 #2:Kenny 建议在向量中保留空间,这是我尝试过的,这样:

但这并没有什么不同。这是现在使用 DataReader 的代码示例。

那么,是否证实上面引用的 2012 年原始解决方案在当今世界行不通?但是当然必须有某种方法可以从文件中读取字节,所以我只是遗漏了一些对其他人来说可能很明显的东西。

最后(我认为)更新:肯尼关于向量需要大小的建议已经达到了目标。如果首先使用 m_file_bytes.assign(buffer.Length(),0) 准备向量,那么它确实会填充文件数据。现在我唯一担心的是我并不真正了解 IAsyncAction 的工作方式,并且可能无法异步循环它,但我们会看到的。