Как обрабатывать RoutedEvents в WinRT Popup

Я немного играю с Windows 8 и создаю приложения для Магазина Windows. В настоящее время я пытаюсь создать всплывающее окно. Я хочу нажать на кнопку (примитивного) пользовательского элемента управления, который размещен как Child из Windows::UI::Xaml::Controls::Primitives::Popup,
Когда я нажал на кнопку, я хочу что-то сделать и в конце концов закрыть всплывающее окно. Как я читаю Вот


Направленные события вне визуального дерева


Если вы хотите обрабатывать перенаправленные события из всплывающего окна или всплывающей подсказки, поместите обработчики в определенные элементы пользовательского интерфейса, которые находятся внутри всплывающего окна или всплывающей подсказки, а не сами элементы всплывающего окна или всплывающие подсказки. Не полагайтесь на маршрутизацию внутри композитинга, который выполняется для контента всплывающих окон или всплывающих подсказок. Это связано с тем, что маршрутизация событий для перенаправленных событий работает только вдоль основного визуального дерева.


Затем я создал некрасивое решение, чтобы передать всплывающее окно (как родительский) в мой пользовательский элемент управления.

void Rotate::MainPage::Image1_RightTapped_1(Platform::Object^ sender, Windows::UI::Xaml::Input::RightTappedRoutedEventArgs^ e)
{
Popup^ popup = ref new Popup();
ImagePopup^ popupchild = ref new ImagePopup(popup); //pass parent's reference to child
popupchild->Tapped += ref new TappedEventHandler(PopupButtonClick);
popup->SetValue(Canvas::LeftProperty, 100);
popup->SetValue(Canvas::TopProperty, 100);
popup->Child = popupchild;
popup->IsOpen = true;
}

void PopupButtonClick(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e){
ImagePopup^ imgPop = static_cast<ImagePopup^>(sender);
if(imgPop != nullptr){
imgPop->CloseParent();
e->Handled = true;
}
e->Handled = false;
}

Есть ли другой путь? Спасибо.

0

Решение

Вы можете поместить всплывающее окно в корень вашего UserControl следующим образом:

<UserControl
x:Class="App15.MyUserControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:App15"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"d:DesignHeight="300"d:DesignWidth="400">

<Grid>
<Popup
x:Name="popup"IsOpen="True">
<Button
Content="Close"Click="Button_Click" />
</Popup>
</Grid>
</UserControl>

Затем спрячьте это изнутри UserControl:

void App15::MyUserControl::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
popup->IsOpen = false;
}

Это не лучший подход, просто другой. Я думаю, что вы, вероятно, должны использовать HorizontalOffset вместо Canvas.Left позиционирование, и также часто лучше сделать всплывающее окно дочерним для некоторой панели, чтобы получать правильные обновления макета и поведение программной клавиатуры с помощью TextBox элементы управления размещены во всплывающих окнах.

1

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

В пространстве имен Windows::UI::Popups Здесь PopupMenu-класс, который обеспечивает именно то, что мне нужно. Он создает всплывающее окно, похожее на контекстное меню в классических настольных приложениях.

Во-первых, создайте новый объект, используя просто

Windows::UI::Popups::PopupMenu^ popupmenu = ref new Windows::UI::Popups::PopupMenu();

После этого введите во всплывающее окно до шести элементов, используя

popupmenu->Commands->Append(ref new Windows::UI::Popups::UICommand("Do Something",
[this](IUICommand^ command){
//your action here
}));

В конце концов, используйте всплывающее окно с вашим назначенным UIElement лайк

popupmenu->ShowAsync(Windows::Foundation::Point(xArg, yArg));

Документация доступна на MSDN (хотя довольно плохо). Пример проекта можно получить из
Вот.

0

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