Как смоделировать Touch Up внутри / снаружи - PullRequest
0 голосов
/ 13 декабря 2011

В настоящее время я портирую приложение с iPhone на Windows Phone.

Поведение кнопок на этих двух платформах весьма различно.

В частности, на iPhone можно нажатькнопку и отпустите кнопку за пределами области кнопки.У iOS есть два события для обработки этого: Touch Up Inside и Touch Up Outside

В Windows Phone и Silverlight, однако, поведение отличается, и, к сожалению, не то, что я хочу.

У вас естьМетод щелчка, который вызывается при нажатии кнопки, либо когда она фактически нажата, либо когда она отпущена;так или иначе (поведение контролируется с помощью значения ClickMode)

Если вы нажмете кнопку и отпустите ее, когда палец точно не находится на кнопке, событие не произойдет (хотя состояние кнопки изменитсячто подтверждается изменением внешнего вида)

В конечном счете, я хотел бы добиться возможности инициировать событие, когда кнопка отпущена, и это событие должно произойти, когда палец отпущен в любом случае, какэто делает на iPhone.Например: нажмите кнопку, переместите палец за пределы кнопки, отпустите палец -> событие сработало. Проблема заключается в обнаружении, когда палец покидает экран, а не когда он просто покидает кнопку (что можно легко определить с помощью OsIsPressedChangeed)

Любые идеи, которые будут высоко оценены

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Возможно, вы можете попробовать захватить сенсорный ввод.Кажется, что он не работает с кнопкой - возможно, он это делает внутри, но, возможно, вы могли бы реализовать свою собственную кнопку, которая это делает.Работает с прямоугольником:

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 голосов
/ 13 декабря 2011

Вот как мне лучше всего удалось смоделировать подобное поведение (событие отпускания ключа генерируется даже тогда, когда палец перестает быть сверху кнопки)

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, даже если оно все еще нажато. Не уверен, как обойти это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...