Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在WinRT弹出窗口中处理RoutedEvents_C++_Xaml_Windows Runtime_Routed Events - Fatal编程技术网

C++ 如何在WinRT弹出窗口中处理RoutedEvents

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 8和构建Windows应用商店应用程序。目前我正在尝试创建一个弹出窗口。我想点击作为
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));