【问题标题】:How to close PopupMenu in WinRT如何在 WinRT 中关闭 PopupMenu
【发布时间】:2015-11-25 21:03:16
【问题描述】:
是否可以在 WinRT 中以编程方式关闭/隐藏PopupMenu?
我试图将注意力集中在其他事情上,但它不起作用。
这个类(PopupMenu)也不提供关闭它的方法。
我也尝试将 PopupMenu 替换为 MenuFlyout,但在我的情况下,当另一个视图出现时,项目已经消失并且无法再隐藏它(以编程方式)。
截图:
【问题讨论】:
标签:
c#
windows-runtime
popup
windows-store-apps
windows-8.1
【解决方案1】:
一旦显示菜单,就无法以编程方式隐藏菜单。
您可以通过等待的 ShowAsync(position) 调用来显示它。等待调用以放弃控制的唯一方法是从菜单中选择一个选项(您可以选择取消选项)或单击菜单外的任意位置。
您使用它的目的是什么?为什么您需要在它显示后取消它而不是让用户自己取消它?我可以想象至少在一种情况下我希望它消失,例如用户打开弹出菜单然后后台进程完成并且弹出菜单上的命令不再适用或需要更新。但是您的使用场景是什么——也许有适合您情况的解决方法?
【解决方案2】:
我找到了解决问题的方法,但我不得不将 PopupMenu 替换为 FlyoutMenu。我没有使用来自PopupMenu 的Commands,而是将点击事件处理程序附加到项目。
public static class FlyoutHelper
{
public static readonly DependencyProperty IsHiddenProperty =
DependencyProperty.RegisterAttached("IsHidden", typeof(bool), typeof(FlyoutHelper), new PropertyMetadata(false, OnIsHiddenPropertyChanged));
public static void SetIsHidden(DependencyObject d, bool value)
{
d.SetValue(IsHiddenProperty, value);
}
public static bool GetIsHidden(DependencyObject d)
{
return (bool)d.GetValue(IsHiddenProperty);
}
private static void OnIsHiddenPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var flyout = d as FlyoutBase;
bool isHidden = (bool)e.NewValue;
if (flyout != null && isHidden)
{
flyout.Hide();
}
}
}
用法:
<MenuFlyout helpers:FlyoutHelper.IsHidden="{Binding IsFlyoutHidden}">
<MenuFlyoutItem Click="Item1Clicked" />
<MenuFlyoutItem Click="Item2Clicked" />
</MenuFlyout>
要隐藏弹出窗口,您只需将视图模型中的 IsFlyoutHidden 切换为 true。