Как добавить обработчик нажатия кнопки C ++ / WinRT?

Как перевести Microsoft ButtonBase.Click Event для 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>

Я мог просто скопировать код с первой кнопки, которую предоставило пустое приложение (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 нет файла кода программной части.


person user34299    schedule 16.01.2019    source источник
comment
На этот вопрос была ссылка в ветке Microsoft здесь: github.com/MicrosoftDocs/windows-uwp / issues / 1398   -  person Gabriel Fair    schedule 23.01.2019


Ответы (1)


Как преобразовать информацию о событии 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.

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

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

Поддержка Visual Studio XAML для C ++ / WinRT близка к тому же уровню, что и C #. Единственным исключением является вкладка «События» в окне «Свойства». В проекте C # вы можете использовать эту вкладку для добавления обработчиков событий; в проекте C ++ / WinRT такой возможности нет. Но см. Обработка событий с помощью делегатов в C ++ / WinRT для получения информации о том, как добавить обработчики событий в ваш код.

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

person miradham    schedule 17.01.2019
comment
miradham, я добавил регистрацию для второй кнопки в конструктор MainPage, основываясь на цитированной вами ссылке. Я не понимаю, что в этом конструкторе для первой кнопки нет такой регистрации, которая является частью пустого приложения. Три вопроса: 1. Почему событие регистрации для первой кнопки отсутствует в сгенерированном Microsoft коде? 2. Можно ли убрать регистрацию 2-й кнопки после одной компиляции? 3. Почему раздел событий на вкладке «Свойства» для элементов управления XAML пуст? Спасибо за ваше время. - person user34299; 17.01.2019
comment
@ user34299 относительно # 1 У вас уже есть Click="ClickHandler" в коде xaml. Это также один из способов добавить обработчик событий. # 2 Нет, не может. Зачем тебе это нужно? # 3 Пока не уверен в этом, позвольте мне обновить свой VS и проверить его. - person miradham; 18.01.2019
comment
@ user34299 Я создал образец приложения C ++ Blank (универсальная версия Windows) и добавил кнопку. Событие щелчка на странице свойств кнопки пусто. При двойном щелчке по нему автоматически создается Button_Click обработчик событий. Согласно вашему описанию кажется, что файлы .cpp и .h не создаются и не удаляются случайно в вашем случае. - person miradham; 18.01.2019
comment
Когда я добавляю кнопку, как вы описываете, в разделе событий на вкладке «Свойства» не отображаются события, которые можно было бы дважды щелкнуть. При нажатии на полужирный световой индикатор вкладки «Свойства» добавленная кнопка отображается в виде кнопки с ее именем, но без событий, только с текстом, в котором должны быть списки событий. Элемент документа не имеет файла кода программной части. Добавьте файл кода программной части и определение класса перед добавлением обработчиков событий. - person user34299; 18.01.2019
comment
Вы не использовали то же приложение меню VS, что и я. Как вы сказали, вы используете пустое приложение C ++ (Universal Windows). Я использую пустое приложение C ++ (C ++ / WinRT), которое отмечено как экспериментальное в правом верхнем углу. Приложение, которое я использую, находится дальше по меню от того, которое вы выбрали после добавления расширения C ++ / WinRT в Visual Studio. - person user34299; 18.01.2019
comment
@ user34299, пожалуйста, проверьте мой обновленный ответ. Кажется, что представление дизайна xaml еще не поддерживается для C ++ / WinRT. - person miradham; 21.01.2019
comment
Спасибо за полный ответ. Раньше я использовал MFC и C # / WPF для приложений Windows. В декабре, когда я узнал о полностью совместимом с C ++ 17 SDK для приложений Windows, я начал его изучать. Отсутствие поддержки событий XAML заставило меня подумать, что я что-то делаю не так. Крупный выпуск C ++ / WinRT от Microsoft состоялся в мае 2018 года, и об этой проблеме не упоминалось, хотя к тому времени она уже существовала уже давно. - person user34299; 22.01.2019
comment
@ user34299 Я сообщил об этой недостающей точке в документах MS как о проблеме с github и получил ответ от MS. См. Обновленный ответ. Пожалуйста, не стесняйтесь комментировать проблему с github, если считаете, что им нужно добавить что-то еще в документы. Если вы считаете, что мой ответ полезен, не забудьте принять его (: - person miradham; 23.01.2019
comment
Где stevewhims разместил эту тему, которая, по его словам, сейчас в прямом эфире? - person user34299; 24.01.2019
comment
@ user34299 Это здесь - person miradham; 25.01.2019