2011-02-06 6 views
12

Necesito abrir un menú y dado que WP7 es not designed para realizar tales acciones, estoy tomando la ayuda de Toolkit. A continuación se muestra el código de ejemplo:ContextMenu de toque en lugar de mantener pulsado

<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> 

Ahora funciona bien siempre que el usuario mantenga presionada la tecla. Pero no puedo pedirle al usuario esa acción. Necesito mostrar el menú en un solo clic/toque/toque/gesto (como quiera llamar). ¿Puede alguien sugerir? Si cree que el kit de herramientas no es la mejor opción, sugiera alternativas con el código de muestra. Probé una ventana emergente pero eso fue más malo que bueno para mi aplicación

Respuesta

14

Puede agregar GestureListener al Border y suscribirse al evento Tap. En el controlador de eventos, obtiene el ContextMenu para el Border y establece IsOpen en verdadero si no tiene un elemento primario lógico.

<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; 
    } 
} 
+0

Eso hace el trabajo. En otros comentarios. Alguna idea sobre cómo resaltar la opción seleccionada. Quiero resaltar solo la fila seleccionada con el color de fondo de la fila configurado en gris o algo – Ravi

+1

@Ravi: ¿Tiene que resaltar el 'MenuItem' seleccionado en base a alguna condición antes de abrir el' ContextMenu'? Tal vez intente nombrar 'MenuItem's y establecer' menuItem1.Background = new SolidColorBrush (Colors.Gray); 'basado en la condición –

+0

increíble ... gracias ... no lo intenté en el menú pero lo usé en otro lado y funciona como un encanto. – Ravi

0

Si desea un menú contextual para su aplicación, entonces el ContextMenu y ContextMenuService son el mejor enfoque, ya que es estándar en aplicaciones de terceros y preinstaladas . Los usuarios ya entienden el gesto de "tocar y mantener", por lo que trabajar en ese sentido no será intuitivo.

Si (por cualquier razón) debe iniciar un ContextMenu de un solo toque, entonces siempre se puede personalizar el código fuente para ContextMenu.cs del juego de herramientas para que en vez de enganchar el evento Hold que enlaza el evento Tap.

+0

Hola Derek, eso no ayudó mucho. Teniendo en cuenta el hecho de que soy bastante nuevo en WP7 y Silverlight, revisé el código fuente pero no entendí mucho. ¿Puedes ayudarme a cambiar la acción de tocar y mantener presionada para tocar? – Ravi

+0

Descargue el código fuente de Silverlight Toolkit, abra el archivo fuente al que hice referencia, cambie '.Hold + =' a '.Tap + =', recompile, actualice la referencia en su proyecto al nuevo ensamblado. Todavía dudo que cambiar el comportamiento predeterminado sea la manera correcta de hacerlo. –

+0

Hola Derek, probablemente tengas razón. Debo ir con la sugerencia de Meleak y usar el servicio de gestos. Gracias de todos modos – Ravi

Cuestiones relacionadas