Я немного играю с 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;
}
Есть ли другой путь? Спасибо.
Вы можете поместить всплывающее окно в корень вашего 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
элементы управления размещены во всплывающих окнах.
В пространстве имен 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 (хотя довольно плохо). Пример проекта можно получить из
Вот.