如何添加C ++ / WinRT Button Click处理程序?

时间:2019-01-16 22:00:29

标签: c++ c++-winrt

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

在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>

我可以从Blank App(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没有代码隐藏文件。

1 个答案:

答案 0 :(得分:0)

  

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

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

this页中,您可以找到有关C ++ / Winrt中事件处理的更多信息。链接介绍了如何使用委托处理和撤消事件,并给出了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扩展名后,我可以通过创建Blank App(C ++ / Winrt)轻松重现此问题。

我从github上检查了photo editor sample app,以进一步调试该问题。在此示例应用程序中,我无法加载XAML设计模式。首先,它要求我将Windows版本更新为1809,但更新失败。因此,我决定回滚到不需要Windows 1809更新的this提交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中使用委托处理事件以获取有关如何向代码中添加事件处理程序的信息。”

     

此更改应尽快生效。请让我知道是否还有其他可以添加的内容。