如何在WinRT Popup中处理RoutedEvents

时间:2013-04-23 19:57:29

标签: c++ xaml windows-runtime routed-events

我正在玩Windows 8并构建Windows应用商店应用。目前我正在尝试创建一个弹出窗口。我想点击(原始)用户控件上的按钮,该控件作为Child的{​​{1}}托管。
当我点击按钮时,我想做一些事情并最终关闭弹出窗口。当我读到here


可视树之外的路由事件

... 如果要处理来自Popup或ToolTip的路由事件,请将处理程序放在Popup或ToolTip中的特定UI元素上,而不是Popup或ToolTip元素本身。不要依赖于为Popup或ToolTip内容执行的任何合成内的路由。这是因为路由事件的事件路由仅适用于主视觉树。 ...


然后我创建了一个丑陋的解决方案,将弹出窗口(作为父窗口)传递给我的自定义控件。

Windows::UI::Xaml::Controls::Primitives::Popup

还有其他方法吗?谢谢。

2 个答案:

答案 0 :(得分:1)

您可以将弹出窗口放在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 :(得分:0)

在命名空间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上找到(虽然很差)。可以从中获取示例项目 here