C++ 如何添加C++/WinRT按钮点击处理程序?

C++ 如何添加C++/WinRT按钮点击处理程序?,c++,c++-winrt,C++,C++ Winrt,如何将Microsoft C++/WinRT信息转换为原型声明和定义 在Visual Studio Community 2017的15.9.5版中,我创建了一个标准项目,即Blank App(C++/WinRT),其中包含一个按钮(myButton)。我想学习如何添加第二个按钮。我已经为第二个按钮(myButton2)添加了XAML代码,但此后我被卡住了 <Page x:Class="X003.MainPage" xmlns="http://schemas.microsof

如何将Microsoft C++/WinRT信息转换为原型声明和定义

在Visual Studio Community 2017的15.9.5版中,我创建了一个标准项目,即Blank App(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>
进入单击处理程序。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;
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没有代码隐藏文件

如何将Microsoft ButtonBase.Click事件信息转换为原型声明和定义

不确定您所说的原型声明和定义是什么意思,因为给定的信息本身就是原型

在第页中,您可以找到有关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:我试图检查有关错误的
文档项没有代码隐藏文件。当用户尝试访问属性和事件处理程序时,在添加事件处理程序之前添加代码隐藏文件和类定义。在安装扩展后,我可以通过创建空白应用程序(C++/Winrt)轻松重现这个问题

我从ms github进行了检查,以进一步调试此问题。在这个示例应用程序中,我无法加载XAML设计模式。首先,它要求我将Windows版本更新到1809,但我未能更新。所以我决定回滚到提交id,它不需要Windows1809更新

在此XAML设计失败后,
缺少一些程序集引用。生成以还原NuGet缓存可能会解决此问题。
错误。研究结果让我得出了这个结论,并以以下评论结束

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

在MS docs github中打开后,我从他们那里得到了以下响应,并根据更新的MS docs的数量

我在本主题的“Blank App(C++/WinRT)”小节中添加了以下信息,因为这是使用XAML作为UI的项目模板

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

这个改变应该很快就会生效。如果还有什么需要补充的,请告诉我


米拉德姆,我添加了第二个按钮,用于主页的构造函数,基于引用的引用。我不理解的是,在第一个按钮的构造函数中没有这样的注册,这个按钮是空白应用程序的一部分。三个问题:1。为什么第一个按钮的注册事件不存在?在Microsoft生成的代码中?2.第二个按钮的注册可以在一次编译后删除吗?3.为什么XAML控件的“属性”选项卡的“事件”部分为空?谢谢您的时间。@user34299关于#1您已经有了
Click=“ClickHandler”“
在xaml代码中。这也是添加事件处理程序的一种方法#不,不行。你为什么要这样做#3,关于这个还不确定,让我更新我的VS并检查它。@ USER2429我创建了C++ Blank App(通用Windows)的样本并添加了一个按钮。按钮的“属性”页中的“单击事件”为空。当双击该按钮时,单击事件处理程序自动生成。根据您的描述,
.cpp
.h
文件似乎不是在您的情况下意外生成或删除的。当我添加一个按钮时,按照您描述的方式,“属性”选项卡的“事件”部分显示没有可双击的事件。单击Properties选项卡的lighting bold(以粗体显示)将新添加的按钮显示为带有名称的按钮,但没有事件,只有事件列表应显示的文本,“文档项没有代码隐藏文件。在添加事件处理程序之前添加代码隐藏文件和类定义。”正如你所说的,你没有使用与I. You使用C++ Blank App(通用Windows)相同的VS菜单应用程序。我使用C++ Blank App(C++ + WiRT),它被标记为“实验”在右上描述。在将C++/WinRT扩展添加到Visual Studio后,我正在使用的应用程序位于菜单下方。此问题在Microsoft线程中链接到: