Подтвердить что ты не робот

ContextMenu на кране, а не нажмите и удерживайте

Мне нужно открыть меню, и поскольку 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>

Теперь это работает отлично, пока пользователь делает нажатие и удерживает действие. Но я не могу спросить пользователя о таких действиях. Мне нужно отобразить меню одним нажатием кнопки /tap/touch/gesture (независимо от того, что вы хотите назвать). Может кто-нибудь предложить? Если вы считаете, что инструментарий не самый лучший способ, то, пожалуйста, предложите альтернативы с образцом кода. Я попробовал всплывающее окно, но это было хуже, чем хорошо для моего приложения

4b9b3361

Ответ 1

Вы можете добавить GestureListener в Border и подписаться на событие Tap. В обработчике событий вы получаете ContextMenu для Border и устанавливаете 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;
    }
}

Ответ 2

Если вы хотите использовать контекстное меню для своего приложения, наилучшим подходом являются ContextMenu и ContextMenuService, поскольку он является стандартным для сторонних и предварительно установленных приложений. Пользователи уже понимают жест "tap-and-hold", поэтому работа вокруг этого будет противоречивой.

Если (по какой-либо причине) вы должны инициировать ContextMenu одним нажатием, вы всегда можете настроить исходный код для ContextMenu.cs из Silverlight Toolkit, чтобы вместо привязки события Hold он перехватывал событие Tap.