Как добавить обработчик нажатий кнопок C ++ / WinRT? - PullRequest
0 голосов
/ 17 января 2019

Как можно перевести информацию о событии Microsoft ButtonBase.Click для C ++ / WinRT в объявление и определение прототипа?

В Visual Studio Community 2017, версия 15.9.5, я создал стандартный проект, а именно Blank App (C ++ / WinRT), в котором есть кнопка (myButton). Я хочу узнать, как добавить вторую кнопку. Я добавил код XAML для второй кнопки (myButton2), но после этого застрял.

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

в обработчик кликов. Первая строка документации 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 голосов
/ 17 января 2019

Как преобразовать информацию о событии Microsoft ButtonBase.Click для C ++ / WinRT в объявление и определение прототипа?

Не уверен, что вы подразумеваете под prototype declaration and definition, поскольку сама информация является прототипом.

На этой странице вы можете найти больше информации об обработке событий в 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, когда пользователь пытается получить доступ к свойствам и обработчикам событий. Я мог бы легко воспроизвести эту проблему, создав пустое приложение (C ++ / Winrt) после установки расширения cppwinrt .

Я проверил пример приложения для редактирования фотографий из ms github для дальнейшей отладки этой проблемы. В этом примере приложения мне не удалось загрузить режим разработки XAML. Сначала он попросил меня обновить версию Windows до 1809, но мне не удалось обновить. Поэтому я решил вернуться к этому идентификатору коммита, который не требует обновления Windows 1809.

После этого проект XAML завершился с ошибкой Some assembly references are missing. Building to restore the NuGet cache might resolve this issue.. Исследование привело меня к этой проблеме , которая закрыта следующим комментарием

В настоящее время это не поддерживается. В настоящее время команда XAML работает над поддержкой дизайнера, поэтому вы должны увидеть это в будущем обновлении Windows SDK.

После открытия проблемы в MS docs github я получил от них следующий ответ и соответственно обновил страницу документации MS.

Я добавил следующую информацию в подраздел «Пустое приложение (C ++ / WinRT)» этой темы, поскольку это шаблон проекта, который использует XAML в качестве пользовательского интерфейса.

"Поддержка поверхности разработки Visual Studio XAML для C ++ / WinRT близка к паритету с C #. Единственным исключением является вкладка Events в окне Properties. В проекте C # вы можете использовать эту вкладку для добавления обработчиков событий; в C ++ Проект / WinRT, такого средства нет. Но посмотрите, как обрабатывать события, используя делегаты в C ++ / WinRT, чтобы узнать, как добавить обработчики событий в ваш код. "

Это изменение должно скоро появиться. Пожалуйста, дайте мне знать, если я могу добавить что-нибудь еще.

...