Categorías destacadas
programacion php    
Artículo
0
¡votar!

 Evento Touch Hold Windows Phone 7

En los anteriores artículos hemos visto los gestos Tap, DoubleTap, Pan y Flick, en este nos vamos a centrar en Touch and Hold, cuando realizamos aplicaciones para Escritorio solemos utilizar el botón derecho del ratón para sacar generalmente un menú contextual, en los dispositivos tactiles al no tener ratón este evento se simula al pulsar en un lugar durante un determinado tiempo, siguiendo los ejemplos anteriores vamos a construir un behaivor que simule este gesto, lo vamso a llamarTouchAndHoldAction que podremos aplicar a cualquier UIElement.

evento touch hold windows phone 7

public class TouchAndHoldAction : DoubleTapAction{
public event EventHandler TouchAndHold; 
private Point? TapLocation; 
private DispatcherTimer timer = new DispatcherTimer(); 
public int HoldTimeoutInMilliseconds{ 
get { return (int)GetValue(HoldTimeoutInMillisecondsProperty); } 
set { SetValue(HoldTimeoutInMillisecondsProperty, value); } 
} 
public static readonly DependencyProperty HoldTimeoutInMillisecondsProperty =
DependencyProperty.Register("HoldTimeoutInMilliseconds", 
typeof(int), typeof(TouchAndHoldAction), 
new PropertyMetadata(2000)); 
public int Tolerance {
get { return (int)GetValue(ToleranceProperty); }
set { SetValue(ToleranceProperty, value); } 
} 
public static readonly DependencyProperty ToleranceProperty = 
DependencyProperty.Register("Tolerance", typeof(int), 
typeof(TouchAndHoldAction), 
new PropertyMetadata(2)); 
protected override void OnAttached(){
base.OnAttached();
this.AssociatedObject.MouseLeftButtonDown += AO_MouseLeftButtonDown; 
this.AssociatedObject.MouseMove += AO_MouseMove;
this.timer.Tick += timer_Tick; 
} 
protected override void OnDetaching(){ 
this.AssociatedObject.MouseLeftButtonDown -= AO_MouseLeftButtonDown; 
this.AssociatedObject.MouseMove -= AO_MouseMove; 
this.timer.Tick -= timer_Tick; 
base.OnDetaching(); 
} 
void AO_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){ 
var pos = e.GetPosition(null); 
OnTouchAndHoldStarted(pos); 
} 
void AO_MouseMove(object sender, MouseEventArgs e){ 
if (TapLocation.HasValue){ 
var pos = e.GetPosition(null);
if (Math.Abs(TapLocation.Value.X - pos.X) > Tolerance || 
Math.Abs(TapLocation.Value.Y - pos.Y) > Tolerance){ 
OnTouchAndHoldStarted(pos); 
} 
} 
} 
void timer_Tick(object sender, EventArgs e){ 
OnTouchAndHoldCompleted(); 
timer.Stop(); 
TapLocation = null; 
} 
protected override void OnTap(){ 
timer.Stop(); 
base.OnTap(); 
} 
protected virtual void OnTouchAndHoldStarted(Point pt){ 
TapLocation = pt; 
timer.Stop(); 
timer.Interval = new TimeSpan(0, 0, 0, 0, HoldTimeoutInMilliseconds); 
timer.Start(); 
} 
protected virtual void OnTouchAndHoldCompleted(){
MouseDown = false;
if (TouchAndHold != null) { 
TouchAndHold(this.AssociatedObject, EventArgs.Empty); 
} 
} 
}


Este behaivor tiene la propiedad HoldTimeoutInMilliseconds que le indicaremos el tiempo en milisegundos que el usuario tiene que tener presionado, si pasa este tiempo lanzara el evento TouchAndHold, luego he puesto la propiedad Tolerance que permitirá al usuario poder desplazar el dedo durante los pixels que le indiquemos en esta propiedad si mueve el demo mas de esta longitud anularemos el vento.

Para el ejemplo vamos a utilizar el código del anterior artículo y pondremos este gesto en todos los borders redondeados que teníamos, el XAML sería
<Border HorizontalAlignment="Left" Height="368" Margin="19,231,0,0" VerticalAlignment="Top" Width="441" BorderBrush="White" BorderThickness="2" Background="#FF313131"> 
<Canvas Background="Transparent"> 
<Canvas.Resources> 
<Style x:Key="RoundedBorder" TargetType="Border"> 
<Setter Property="BorderThickness" Value="3"/> 
<Setter Property="CornerRadius" Value="20"/> 
<Setter Property="Background" Value="#FF287E3D"/> 
<Setter Property="BorderBrush" Value="#FF0F451C"/> 
<Setter Property="Width" Value="25"/> 
<Setter Property="Height" Value="25"/> 
</Style> 
</Canvas.Resources> 
<i:Interaction.Behaviors> 
<!--<local:PanAction />--> 
<!--<local:FlickAction />--> 
<!--<local:ZoomAction />--> 
</i:Interaction.Behaviors> 
<Border Canvas.Left="43" Canvas.Top="137" Style="{StaticResource RoundedBorder}" > 
<i:Interaction.Behaviors> 
<local:TouchAndHoldAction TouchAndHold="TouchAndHoldAction_TouchAndHold" /> 
</i:Interaction.Behaviors> 
</Border> 
<Border Canvas.Left="122" Canvas.Top="83" Style="{StaticResource RoundedBorder}" > 
<i:Interaction.Behaviors> 
<local:TouchAndHoldAction TouchAndHold="TouchAndHoldAction_TouchAndHold" /> 
</i:Interaction.Behaviors> 
</Border>
<Border Canvas.Left="294" Canvas.Top="301" Style="{StaticResource RoundedBorder}" >
<i:Interaction.Behaviors> 
<local:TouchAndHoldAction TouchAndHold="TouchAndHoldAction_TouchAndHold" /> 
</i:Interaction.Behaviors> 
</Border> 
<Border Canvas.Left="273" Canvas.Top="51" Style="{StaticResource RoundedBorder}" > 
<i:Interaction.Behaviors>
<local:TouchAndHoldAction TouchAndHold="TouchAndHoldAction_TouchAndHold" /> 
</i:Interaction.Behaviors> 
</Border> 
<Border Canvas.Left="74" Canvas.Top="242" Style="{StaticResource RoundedBorder}" > 
<i:Interaction.Behaviors> 
<local:TouchAndHoldAction TouchAndHold="TouchAndHoldAction_TouchAndHold" /> 
</i:Interaction.Behaviors> 
</Border> 
<Border Canvas.Left="236" Canvas.Top="167" Style="{StaticResource RoundedBorder}" > 
<i:Interaction.Behaviors> 
<local:TouchAndHoldAction TouchAndHold="TouchAndHoldAction_TouchAndHold" /> 
</i:Interaction.Behaviors> 
</Border> 
</Canvas>
</Border>

Como podéis ver en el XAML enlazamos el behaivor y lo enlazamos al evento TouchAndHoldAction_TouchAndHold en este evento cambiaremos el colñor de los puntos, quedándonos

resultado evento touch hold

Autor del artículo: Oscar Álvarez
   
Publicado por:
Angel Carrero
Recomendar
a un amigo
Compartir
en redes
 
Comentarios
 
BBDD
Entornos de desarrollo
Entretenimiento
Herramientas
Internet
Lenguajes de script
Lenguajes imperativos
Lenguajes orientados a objeto
Otros lenguajes
Plataformas
Teoría
Varios
Copyright © 1998-2011 Programación en Castellano. Todos los derechos reservados
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad

Diseño web y desarrollo web. Un proyecto de los hermanos Carrero.

Red internet:
Juegos gratis | Servidores dedicados
Más internet: Password | Directorio de weblogs | Favicon