【问题标题】:ContextMenu on tap instead of tap and hold上下文菜单点击而不是点击并按住
【发布时间】:2011-02-06 11:49:56
【问题描述】:

我需要打开一个菜单,由于 WP7 是 not designed 来执行这些操作,我正在使用 Toolkit 的帮助。以下是示例代码:

<Border BorderThickness="3" Padding="6">
     <toolkit:ContextMenuService.ContextMenu>
         <toolkit:ContextMenu>
             <toolkit:MenuItem Header="item1" Click="Item1_Click" />
             <toolkit:MenuItem Header="item2" Click="Item2_Click" />
             <toolkit:MenuItem Header="item3" Click="Item3_Click" />
         </toolkit:ContextMenu>
     </toolkit:ContextMenuService.ContextMenu>
     <TextBlock Text="Tap" />
</Border>

现在只要用户按下并按住操作,它就可以正常工作。但我不能要求用户采取这样的行动。我需要通过单击/点击/触摸/手势显示菜单(无论您想调用它)。有人可以建议吗?如果您认为工具包不是最好的方法,那么请使用示例代码提出替代方案。我尝试了弹出窗口,但这对我的应用程序弊大于利

【问题讨论】:

    标签: c# silverlight windows-phone-7 silverlight-toolkit


    【解决方案1】:

    您可以将GestureListener 添加到Border 并订阅Tap 事件。在事件处理程序中,您会为 Border 获取 ContextMenu,如果它没有逻辑父级,则将 IsOpen 设置为 true。

    <Border BorderThickness="3" Padding="6">
        <toolkit:GestureService.GestureListener>
            <toolkit:GestureListener Tap="GestureListener_Tap" />
        </toolkit:GestureService.GestureListener>
        <toolkit:ContextMenuService.ContextMenu>
            <toolkit:ContextMenu>
                <toolkit:MenuItem Header="item1" Click="Item1_Click" />
                <toolkit:MenuItem Header="item2" Click="Item2_Click" />
                <toolkit:MenuItem Header="item3" Click="Item3_Click" />
            </toolkit:ContextMenu>
        </toolkit:ContextMenuService.ContextMenu>
        <TextBlock Text="Tap" />
    </Border>
    
    private void GestureListener_Tap(object sender, GestureEventArgs e)
    {
        Border border = sender as Border;
        ContextMenu contextMenu = ContextMenuService.GetContextMenu(border);
        if (contextMenu.Parent == null)
        {
            contextMenu.IsOpen = true;
        }
    }
    

    【讨论】:

    • 就可以了。在旁注中。关于如何突出显示所选选项的任何想法。我只想突出显示所选行,并将行背景颜色设置为灰色或其他内容
    • @Ravi:在打开ContextMenu之前,您是否必须根据某些条件突出显示选定的MenuItem?也许尝试命名MenuItem 并根据条件设置menuItem1.Background = new SolidColorBrush(Colors.Gray);
    • 太棒了...谢谢...我没有在 menuitem 上尝试过,但在其他地方使用过,效果很好。
    • 嗨,这个解决方案似乎有问题,当我第一次启动我的应用程序并点击文本框时,上下文菜单位于屏幕顶部:i.stack.imgur.com/ekOOI.png 当我切换在我的枢轴导航页面中,上下文菜单的位置发生了变化:i.stack.imgur.com/0L0Hb.png 任何想法如何解决这个问题?
    【解决方案2】:

    如果您想要应用程序的上下文菜单,那么 ContextMenuContextMenuService 是最好的方法,因为它是第三方应用程序和预安装应用程序的标准配置。用户已经理解“点击并按住”手势,因此解决这个问题将是违反直觉的。

    如果(无论出于何种原因)您必须通过单击启动 ContextMenu,那么您始终可以从 Silverlight 工具包自定义 ContextMenu.cs 的源代码,这样它就不会挂钩 Hold 事件,而是挂钩Tap 事件。

    【讨论】:

    • 嗨,Derek,这并没有多大帮助。考虑到我对 WP7 和 silverlight 还很陌生,我检查了源代码但不太了解。你能帮我把点击并按住动作改为点击吗?
    • 下载Silverlight Toolkit的源代码,打开我引用的源文件,将.Hold += 更改为.Tap +=,重新编译,将你项目中的引用更新为新的程序集。不过,我仍然非常怀疑更改默认行为是否正确。
    • 嗨,德里克,你可能是对的。我应该接受Meleak的建议并使用手势服务。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多