我尝试在LongListSelector
中实现自定义ContextMenu。WP8的自定义上下文菜单XAML
我不使用从Microsoft.Phone.Controls.Toolkit
的ContextMenu
,这是基本相同的行1应用:
http://static.hiddenpineapple.com/images/rowi-phone.png
方法1
我的列表项切换上保持和覆盖一个的VisualState显示在其中的控件。
我不能找到一种方法,当用户点击列表项之外(如默认文本菜单)返回到默认状态的问题。
方法2
我实现了这个工具包文本菜单看起来一模一样的自定义模板。我必须将其保证金顶部移至-itemHeight
,因为默认情况下它低于该项目。
问题
这种解决方案的问题是,它打开,我无法弄清楚如何避免这种情况的时候自动关闭自身。
另一个问题是,它不适用于工具包中的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的提示。
我编辑了我的问题,因为我的回复很长时间以供评论。非常感谢您的帮助! –