【问题标题】:How do you add a C++/WinRT Button Click handler?如何添加 C++/WinRT 按钮单击处理程序?
【发布时间】:2019-01-25 08:52:56
【问题描述】:

如何将 C++/WinRT 的 Microsoft ButtonBase.Click Event 信息转换为原型声明和定义?

在 Visual Studio Community 2017 版本 15.9.5 中,我创建了一个标准项目,即空白应用 (C++/WinRT),其中包含一个按钮 (myButton)。我想学习如何添加第二个按钮。我为第二个按钮 (myButton2) 添加了 XAML 代码,但此后我被卡住了。

<Page
    x:Class="X003.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:X003"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel x:Name="stackPan" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"  Background="LightBlue">
        <Button x:Name="myButton" Click="ClickHandler">Click Me</Button>
        <Button x:Name="myButton2" Click="ClickHandler2">Click Me2</Button>
    </StackPanel>
</Page>

我可以从空白应用程序 (C++/WinRT) 提供的第一个按钮中复制代码。但是,如果我没有第一个按钮作为示例,我将不知道如何翻译 Microsoft 文档,即,

// Register
event_token Click(RoutedEventHandler const& handler) const;

// Revoke with event_token
void Click(event_token const& cookie) const;

// Revoke with event_revoker
Click_revoker Click(auto_revoke_t, RoutedEventHandler const& handler) const;

进入 Click 处理程序。 Microsoft 文档的第一行,即,

event_token Click(RoutedEventHandler const& handler) const;

我认为是用于创建处理程序的格式。它看起来不像项目中已经存在的处理程序,即,

void ClickHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::RoutedEventArgs const& args);

我认为可以将其添加到 .idl 文件中。但是,.idl 文件中没有第一个按钮。

Microsoft 提供的示例代码适用于 C#,即使在页面右上角选择了“C++/WinRT”也是如此。

新版C++/WinRT文档很多,几乎太多了。由于使用过 C#/WPF/XAML,我无法清楚地看到使用 C++/WinRT 进行类似工作的方式。

最后,项目属性选项卡没有任何帮助。在 C# 中,事件被列出,选择一个将导致在代码中创建声明和基本定义。对于 C++/WinRT,当光标位于 XAML 页面中的控件上时,属性页面的事件部分会显示控件的名称 myButton 或 myButton2,并指示“文档项没有代码隐藏文件。添加添加事件处理程序之前的代码隐藏文件和类定义。”但是,没有现有按钮 myButton 的代码隐藏文件。

【问题讨论】:

标签: c++ c++-winrt


【解决方案1】:

如何将 C++/WinRT 的 Microsoft ButtonBase.Click 事件信息转换为原型声明和定义?

不确定prototype declaration and definition 是什么意思,因为给定的信息本身就是原型。

this 页面中,您可以找到有关 C++/Winrt 中事件处理的更多信息。 Link 解释了使用委托处理和撤销事件,并给出了C++/WinRT 的按钮单击事件处理示例。简而言之,您需要有处理程序并通过委托注册它。

// function that handles event
void MainPage::ClickHandler(IInspectable const& /* sender */, RoutedEventArgs const& /* args */)
{
    Button().Content(box_value(L"Clicked"));
}
...
// register above function for event handler
Button().Click({ this, &MainPage::ClickHandler });

UPD:当用户尝试访问属性和事件处理程序时,我尝试检查错误 The document item has no code-behind file. Add a code-behind file and a class definition before adding event handlers。在安装 cppwinrt 扩展后,我可以通过创建空白应用程序 (C++/Winrt) 轻松重现此问题。

我检查了来自 ms github 的 photo editor sample app 以进一步调试此问题。在此示例应用程序中,我未能加载 XAML 设计模式。首先它要求我将我的 Windows 版本更新到 1809,但我没有更新。所以我决定回滚到不需要 Windows 1809 更新的this commit id。

在此 XAML 设计失败并出现 Some assembly references are missing. Building to restore the NuGet cache might resolve this issue. 错误之后。研究将我引向此issue,并以以下评论结束

目前不受支持。 XAML 团队目前正在致力于设计器支持,因此您应该会在未来的 Windows SDK 更新中看到这一点。

在 MS docs github 中打开 issue 后,我收到了他们的以下回复,并根据 MS docs 的 page 进行了更新。

我已将以下信息添加到本主题的“空白应用程序 (C++/WinRT)”小节,因为这是使用 XAML 作为其 UI 的项目模板。

“Visual Studio 对 C++/WinRT 的 XAML 设计图面支持与 C# 接近。一个例外是“属性”窗口的“事件”选项卡。对于 C# 项目,您可以使用该选项卡添加事件处理程序;对于 C++ /WinRT 项目,该工具不存在。但请参阅使用 C++/WinRT 中的委托处理事件,了解如何将事件处理程序添加到代码中。"

此更改应该很快就会生效。如果还有什么可以补充的,请告诉我。

【讨论】:

  • miradham,根据您引用的参考资料,我将第二个按钮的注册添加到 MainPage 的构造函数中。我不明白的是,第一个按钮的构造函数中没有这样的注册,该按钮是空白应用程序的一部分。三个问题: 1. 为什么微软生成的代码中没有第一个按钮的注册事件? 2. 2nd button 的注册可以在一次编译后取消吗? 3. 为什么 XAML 控件的属性选项卡的事件部分是空白的?感谢您的宝贵时间。
  • @user34299 关于#1 你已经在 xaml 代码中有 Click="ClickHandler"。这也是添加事件处理程序的一种方法。 #2 不,它不能。你为什么要这样做? #3 对此还不确定,让我更新我的 VS 并检查一下。
  • @user34299 我创建了示例 C++ 空白应用程序(通用 Windows)并添加了一个按钮。 Button 属性页面中的单击事件为空。当双击它时,Button_Click 事件处理程序自动生成。根据您的描述,在您的情况下,.cpp.h 文件似乎不是意外生成或删除的。
  • 当我添加一个按钮时,按照您描述的方式,“属性”选项卡的“事件”部分显示没有要双击的事件。单击“属性”选项卡的粗体显示新添加的按钮作为 Button 及其名称,但没有事件,只有事件列表应该是的文本,“文档项没有代码隐藏文件。添加代码隐藏添加事件处理程序之前的文件和类定义。”
  • 您没有使用与我相同的 VS 菜单应用程序。正如您所说,您使用的是 C++ 空白应用程序(通用 Windows)。我正在使用 C++ 空白应用程序 (C++/WinRT),它在右上角的描述中标记为“实验性”。在将 C++/WinRT 扩展添加到 Visual Studio 后,我正在使用的应用位于您选择的应用的下方。
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2018-05-08
  • 2014-05-01
相关资源
最近更新 更多