繁体   English   中英

WP8的自定义上下文菜单XAML

[英]Custom context menu XAML for WP8

我尝试在LongListSelector实现自定义ContextMenu。

我没有使用Microsoft.Phone.Controls.ToolkitContextMenu ,它与Rowi App中的基本上相同:


(来源: hiddenpineapple.com

方法1

我的列表项将VisualState切换为保留状态,并显示一个带有控件的覆盖图。

问题

当用户在列表项之外单击时(如默认的ContextMenu一样),我找不到返回默认状态的方法。

方法2

我为工具箱ContextMenu实现了一个自定义模板,它看起来完全一样。 我必须将其边距顶部移至-itemHeight ,因为默认情况下它位于该项目下方。

问题

该解决方案的问题在于,它在打开时会自动关闭,我不知道该如何避免。
另一个问题是,它与Toolkit中的TiltEffect.IsTiltEnabled一起使用时效果TiltEffect.IsTiltEnabled (视觉问题)。

我需要你的帮助

关于如何使它工作的任何建议?


回答

多亏了Cheese ,现在我知道当用户在外面单击时如何正确关闭菜单。 他的建议是获取当前页面上Tap事件的坐标,并检查它是否在菜单内。 否则,请关闭菜单。

因此,我在菜单打开时向页面添加了Tap侦听器,并在菜单关闭时将其删除。 从页面侦听器中,我得到了事件坐标,并可以检查它是否在包含菜单的控件内(大小和位置相同)。 通过添加ActualWidth和ActualHeight,我收到了Point leftUpperPoint = control.TransformToVisual(page).Transform(new Point(0, 0))rightLowerPoint的位置。

但是后来我意识到:

为什么还要计算水龙头是否在菜单内? 我总是想在用户点击屏幕上的任何位置时关闭菜单。 如果在外面, 是的 如果在菜单按钮上, 则为

我进行的另一个修改是监听MouseLeftButtonDown而不是Tap因为它在用户滑动时也会触发。

所以我删除了这段代码,并提出了以下内容:

private void ToggleMenu(object sender, System.Windows.Input.GestureEventArgs e)
{
  PhoneApplicationFrame frame = ((PhoneApplicationFrame)Application.Current.RootVisual);
  VisualState state = this.States.CurrentState;

  if (state == null || state.Name == "DefaultState")
  {
    frame.MouseLeftButtonDown += MouseDownDelegate;
    this.State = "MenuState";
  }
  else
  {
    frame.MouseLeftButtonDown -= MouseDownDelegate;
    this.State = "DefaultState";
  }
}

private void MouseDownDelegate(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
  ToggleMenu(sender, null);
}

这样完美!

感谢Cheese的提示。

方法1的问题

最好的解决方案是:

获取菜单坐标,当用户点击时-您检查菜单上的点击坐标是否存在,否则查看-取消-简单。

方法2问题

我想您在角落里有一些按钮,当您轻按它时-什么都没发生? 而当您解雇Tilt时,一切都奏效了。 倾斜似乎比单击更快,因此,倾斜会更改按钮坐标以及您错过/或拖过的设备提示

您可以使用@ScottIsAFool的建议,还可以在UIElement类型的TapMenu控件上创建另一个名为CloseWhenTappedElement的Dependency属性,并在设置后自动监听控件内的Tap事件。 例如

<Grid x:Name="TapArea"/>
<TapMenu CloseWhenTappedElement="{Binding ElementName=TapArea"}/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM