2013-11-20 33 views
0

我尝试在LongListSelector中实现自定义ContextMenu。WP8的自定义上下文菜单XAML

我不使用从Microsoft.Phone.Controls.ToolkitContextMenu,这是基本相同的行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的提示。

回答

1

方法1问题

最好的解决办法是:

获取菜单坐标,当用户进行了自来水 - 你检查是点击菜单上的坐标与否,如果没有 - dissmiss - 简单。

方法2问题

我猜你有在一个角落里的一些按钮,并在拍了拍它 - 什么都没有发生?当你解散Tilt都奏效了。看起来倾斜的效果比点击更快,所以,倾斜会改变按钮的坐标,以及您错过/拖动的设备倾斜

+0

我编辑了我的问题,因为我的回复很长时间以供评论。非常感谢您的帮助! –

0

您可以用什么@ScottIsAFool建议,也许在名为CloseWhenTappedElement型UIElement的你TapMenu控制创建另一个依赖项属性和自动听你的控制一旦设置里面点击事件。例如

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