如何模拟内部/外部的触摸

时间:2011-12-13 01:46:28

标签: c# silverlight windows-phone-7

我目前正在将应用程序从iPhone移植到Windows Phone。

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

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

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

您可以在单击按钮时调用Click方法,无论是在实际单击按钮时还是在其被释放时;这种方式或其他方式(通过ClickMode值控制的行为)

如果按下按钮并在手指没有精确按下按钮时将其释放,则不会发生任何事件(尽管按钮状态会因外观变化而改变)

最终,我想要实现的是能够在释放按钮时触发事件,并且当手指在任何一种情况下释放时都会发生该事件,就像在iPhone上一样。 例如: 按下按钮,将手指移到按钮外,松开手指 - >事件触发 问题是检测手指离开屏幕的时间,而不是当它离开按钮时(可以通过OsIsPressedChangeed轻松检测到)

任何想法都会受到高度赞赏

2 个答案:

答案 0 :(得分: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);
    }
}

还有一个小问题;如果您按一个按钮,按住它,按另一个按钮,即使仍按下按钮,也会为第一个按钮生成已发布的事件。不知道如何解决这个问题

答案 1 :(得分: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.");
    }
}
相关问题