C++ 如何在WinRT弹出窗口中处理RoutedEvents
我正在玩一点Windows 8和构建Windows应用商店应用程序。目前我正在尝试创建一个弹出窗口。我想点击作为C++ 如何在WinRT弹出窗口中处理RoutedEvents,c++,xaml,windows-runtime,routed-events,C++,Xaml,Windows Runtime,Routed Events,我正在玩一点Windows 8和构建Windows应用商店应用程序。目前我正在尝试创建一个弹出窗口。我想点击作为Windows::UI::Xaml::Controls::Primitives::Popup的子控件托管的(基本)用户控件上的按钮 当我点击按钮时,我想做点什么,并最终关闭弹出窗口。当我读到 在可视树之外路由事件 。。。 如果要处理来自弹出窗口或工具提示的路由事件,请将处理程序放置在弹出窗口或工具提示中的特定UI元素上,而不是放置在弹出窗口或工具提示元素本身上。不要依赖于为弹出窗口或
Windows::UI::Xaml::Controls::Primitives::Popup的子控件托管的(基本)用户控件上的按钮
当我点击按钮时,我想做点什么,并最终关闭弹出窗口。当我读到
在可视树之外路由事件
。。。
如果要处理来自弹出窗口或工具提示的路由事件,请将处理程序放置在弹出窗口或工具提示中的特定UI元素上,而不是放置在弹出窗口或工具提示元素本身上。不要依赖于为弹出窗口或工具提示内容执行的任何合成内部的路由。这是因为路由事件的事件路由仅沿主可视树工作。
然后我创建了一个丑陋的解决方案,将弹出窗口(作为父控件)传递给我的自定义控件
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;
}
void Rotate::MainPage::Image1_rightstapped_1(平台::对象^sender,Windows::UI::Xaml::输入::rightstappedroutedeventargs ^e)
{
Popup^Popup=ref new Popup();
ImagePopup^popupchild=ref新建ImagePopup(弹出);//将父对象的引用传递给子对象
popupchild->Tapped+=参考新的TappedEventHandler(PopupButtonClick);
弹出->设置值(Canvas::LeftProperty,100);
弹出->设置值(Canvas::TopProperty,100);
弹出->子对象=弹出子对象;
弹出->等参=真;
}
void PopupButtonClick(平台::对象^sender,Windows::UI::Xaml::输入::TappedRoutedEventArgs ^e){
ImagePopup^imgPop=静态广播(发送方);
if(imgPop!=nullptr){
imgPop->CloseParent();
e->Handled=true;
}
e->Handled=false;
}
还有别的办法吗?谢谢。您可以将弹出窗口放在用户控件的根目录下,如下所示:
<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>
这并不是一个更好的方法,只是不同而已。我认为您可能应该使用HorizontalOffset
而不是Canvas.Left
定位,而且通常最好将弹出窗口作为某个面板的子面板,以便使用位于弹出窗口中的TextBox
控件获得正确的布局更新和软键盘行为是弹出菜单
-类,它正好提供了我需要的内容。它创建一个弹出窗口,类似于经典桌面应用程序中的上下文菜单
首先,使用
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
}));
最后,将弹出窗口与指定的ui元素一起使用
popupmenu->ShowAsync(Windows::Foundation::Point(xArg, yArg));
该文档可在上获得(但相当差)。样本项目可从以下网站获得:
.谢谢你的想法。之所以使用Canvas::Left,是因为我想在图像-控件上使用弹出窗口,该控件可以自由放置在画布上,实际上没有其他用于此目的的布局容器。
popupmenu->ShowAsync(Windows::Foundation::Point(xArg, yArg));