2011-12-13 57 views
0

我目前正在将应用程序从iPhone移植到Windows Phone。如何模拟Touch Up内部/外部

按钮的行为在两个平台之间是完全不同的。

特别是,在iPhone上,可以按下按钮并释放按钮区域外的按钮。 iOS有两个事件来处理这个问题:Touch Up Inside和Touch Up Outside

但是,在Windows Phone和Silverlight上,行为是不同的,不幸的是不是我想要的。

您已经点击按钮时调用的Click方法,可以是实际点击或释放按钮; (通过ClickMode值控制的行为)

如果您按下按钮并释放它,而手指不在按钮上,则不会发生任何事件(尽管按钮的状态会按照已证明的方式发生变化通过它的外观变化)

最终,我想实现的是能够触发一个事件,当按钮被释放时,这个事件应该发生在任何情况下手指被释放,就像它在iPhone上一样。 例如: 按下按钮,移动手指的按钮外,松开手指 - >事件触发 当手指离开屏幕,而不是当它只是离开按钮(其可很容易地通过被检测到的问题是检测OsIsPressedChangeed)

任何想法whoulc不胜感激

回答

0

下面是我最好的管理,以模拟出类似的行为(正在生成键释放事件即使在手指不再是按钮的顶部)

public class CalcButton : Button 
{ 
    public delegate void CalcButtonHandler(object sender); 

    public event CalcButtonHandler Pressed; 
    public event CalcButtonHandler Released; 


    private bool hasFocus = false; 
    private bool _isPressed = false; 
    private bool isPressed 
    { 
     set 
     { 
      if (value != _isPressed) 
      { 
       _isPressed = value; 
       Debug.WriteLine(Name + (_isPressed ? " Button Is Pressed" : " Button Is Released")); 
       if (_isPressed) 
       { 
        // custom default press action 
        // here 
        if (Pressed != null) 
        { 
         Pressed(this); 
        } 
       } 
       else 
       { 
        if (Released != null) 
        { 
         Released(this); 
        } 
       } 
      } 
     } 

     get 
     { 
      return _isPressed; 
     } 
    } 

    protected override void OnIsPressedChanged(DependencyPropertyChangedEventArgs e) 
    { 
     Debug.WriteLine(Name + " is pressed change"); 
     if (hasFocus && !base.IsPressed) 
     { 
      isPressed = false; 
     } 
     else if (base.IsPressed) 
     { 
      isPressed = true; 
     } 
     base.OnIsPressedChanged(e); 
    } 

    protected override void OnLostFocus(RoutedEventArgs e) 
    { 
     hasFocus = false; 
     _isPressed = false; // do not trigger key release event 
     Debug.WriteLine(Name + " lost focus"); 
     base.OnLostFocus(e); 
    } 

    protected override void OnGotFocus(RoutedEventArgs e) 
    { 
     hasFocus = true; 
     Debug.WriteLine(Name + " got focus"); 
     base.OnGotFocus(e); 
    } 

    protected override void OnHold(GestureEventArgs e) 
    { 
     _isPressed = false; // do not trigger key release event 
     Debug.WriteLine(Name + " on hold"); 
     base.OnHold(e); 
    } 
} 

还有一个小问题;如果按下按钮,按住按钮,按下另一个按钮,即使仍然按下第一个按钮,也会生成Released事件。不知道如何解决这个问题

0

也许你可以尝试捕捉触摸输入。它似乎没有与一个按钮的工作 - 也许它内部做它,但也许你可以实现自己的按钮。 作品带有长方形:

XAML:

<Rectangle 
    x:Name="rectangle" 
    Fill="Yellow" 
    VerticalAlignment="Bottom" 
    HorizontalAlignment="Stretch" 
    Height="200" 
    MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" 
    MouseLeftButtonUp="Rectangle_MouseLeftButtonUp"/> 

后面的代码:

private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    var success = rectangle.CaptureMouse(); 
} 

private void Rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    rectangle.ReleaseMouseCapture(); 
    Point p = e.GetPosition(rectangle); 

    if (new Rect(0, 0, rectangle.ActualWidth, rectangle.ActualHeight) 
     .Contains(p)) 
    { 
     Debug.WriteLine("Mouse up inside rectangle."); 
    } 
    else 
    { 
     Debug.WriteLine("Mouse up outside rectangle."); 
    } 
} 
+0

谢谢,但这是Silverlight的Windows Phone上;没有鼠标事件.. – jyavenard

+0

有鼠标事件。这是我猜测桌面Silverlight的一次不幸的过渡,但是如果您想要处理单点触摸操作,则可以使用鼠标事件。我认为它不适用于多点触控 - 在这种情况下,您需要使用Touch.FrameReported + =(s,e)=> {};您还可以查看操纵事件(ManipulationStarted/Completed)。 –