(XAML UWP) Определение элементов, включая события для использования на нескольких страницах (c ++)

В настоящее время я пытаюсь централизовать несколько элементов, которые планирую использовать в нескольких местах моего приложения. Например, у меня есть всплывающее окно, которое служит меню навигации в части приложения, но проблема, с которой я сталкиваюсь, заключается в том, что я не могу установить событие «Click» в ресурсах приложения, где я определяю его в App.xaml

<Application.Resources>
<Flyout x:Key="guided_tour_nav">
<StackPanel>
<Button x:Name="home"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Return to Home" Click="home_button_Click"/>
<Button x:Name="water"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="The Water Enters"/>
<Button x:Name="eggs"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Eggs Arrive"/>
<Button x:Name="pre_hatch"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Pre-Hatching"/>
<Button x:Name="tanks"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="The Tanks"/>
<Button x:Name="life_support"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Life Support"/>
<Button x:Name="waste"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="Filtering Waste"/>
<Button x:Name="release"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="The Release"/>
</StackPanel>
</Flyout>
</Application.Resources>

Я использую это в моем mainpage.xaml, и несколько других страниц

<Button Flyout="{StaticResource guided_tour_nav}" Content="Jump to Section"/>

Я сейчас получаю ошибку

WMC1005 Events cannot be set in the Application class XAML file

Я хотел бы иметь возможность определять весь элемент, события кликов и все, на которые можно ссылаться, где бы я ни нуждался, без необходимости переопределять события кликов для каждой страницы. Я предполагаю, что это должно быть как-то возможно, но я совершенно новичок в платформе UWP.

0

Решение

Когда вы создаете Flyout как ресурс в Application.ResourcesВы не можете использовать его с событиями, к сожалению.

Однако есть два альтернативных решения.

Пользовательский контроль пользователя

Вы можете обернуть Flyout в пользовательский элемент управления XAML, а затем легко использовать его в любом месте.

Щелкните правой кнопкой мыши ваш проект UWP в Обозреватель решений и выберите добавлятьНовый предмет …. В диалоговом окне выберите XAML раздел и там найти Пользовательский контроль вариант. Выберите желаемое имя (например, GuidedTourNav) и нажмите добавлять.

Это создает три файла — GuidedTourNavFlyout.xaml, GuidedTourNavFlyout.xaml.h а также GuidedTourNavFlyout.xaml.cpp, Тип по умолчанию пользовательских элементов управления XAML UserControl, Вы должны изменить это. Открой GuidedTourNavFlyout.xaml файл и изменить корневой элемент из UserControl в Flyout:

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

Наконец, замените Grid внутри GuidedTourNavFlyout.xaml код с содержимым всплывающей подсказки и, как обычно, создайте нужный обработчик событий в коде.

Теперь вы можете использовать свой собственный всплывающее окно в любом месте. Сначала добавьте объявление пространства имен XML в корневой элемент вашей страницы. замещать MyApp.CustomControls с пространством имен, где лежит ваш пользовательский элемент управления.

xmlns:controls="using:MyApp.CustomControls"

И теперь вы можете использовать всплывающую подсказку в любом месте, используя сложное свойство:

<Button Content="Hello">
<Button.Flyout>
<controls:GuidedTourNavFlyout />
</Button.Flyout>
</Button>

Использование Resource Dictionary с выделенным кодом

Альтернативным решением было бы создать словарь ресурсов с выделенным кодом как описано здесь. Однако этот подход кажется менее чистым, и я не могу подтвердить, что он работает в C ++.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]