[英]Another “The name 'itembutton' does not exist in the current context” (WP8, XAML)
[英]Custom context menu XAML for WP8
我尝试在LongListSelector
实现自定义ContextMenu。
我没有使用Microsoft.Phone.Controls.Toolkit
的ContextMenu
,它与Rowi App中的基本上相同:
(来源: hiddenpineapple.com )
我的列表项将VisualState切换为保留状态,并显示一个带有控件的覆盖图。
当用户在列表项之外单击时(如默认的ContextMenu一样),我找不到返回默认状态的方法。
我为工具箱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的提示。
@denniscode http://dotnet.dzone.com/articles/rowi-show-tap-menu之类的东西
方法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.