WPF ListBox SelectionChanged периодически не запускается на планшете

Я пытаюсь использовать список WPF на планшете. В фиктивном проекте я просто создал список с большим количеством элементов, и когда я выберу один, этот элемент будет отображаться в текстовом блоке.

У меня есть событие selectionchanged в listBox

На моем ноутбуке все работает так, как должно, но когда я запускаю его на планшете, событие selectionchanged не запускается спорадически. На экране старый выбранный элемент остается выделенным, а новый выбранный выделяется, но элемент не отображается в текстовом блоке.

При удаленной отладке я заметил, что все события TouchDown, TouchMove и TouchUp запускаются, но иногда selectionChanged не запускается.

эти вещи я тоже пробовал: установка в Xaml внутри списка:

ScrollViewer.PanningMode="None"

Когда я делаю это, всегда запускается событие selectionchanged, но пользователь больше не может прокручивать вниз с помощью прокрутки (что должно быть возможно. Я думаю, что здесь где-то проблема, но у меня пока нет решения.

Нужна помощь.


person Gert Hermans    schedule 13.06.2013    source источник


Ответы (1)


Спустя долгое время решение этой проблемы было найдено. сначала нам нужны некоторые переменные

private TouchPoint _movePoint;
private double _minimum = 0;
private double _maximum;

Мне нужно поймать событие TouchMove в listBox. Это событие срабатывает много раз. Нам нужно получить максимальное и минимальное значение Y, где было прикосновение.

private void myListBox_TouchMove(object sender, TouchEventArgs e)
{
    _movePoint := e.GetTouchPoint(myListBox);
if (_minimum.Equals(0))
{
        _minimum := _movePoint.Position.Y;
        _maximum := _movePoint.Position.Y;
        return;
}

if (_movePoint.Position.Y < _minimum) 
_minimum := _movePoint.Position.Y;
if (_movePoint.Position.Y > _maximum) 
    _maximum := _movePoint.Position.Y;
}

Теперь в событии TouchUp мы смотрим, насколько далеко было сдвинуто в вертикальном направлении. Если это не слишком много (в этом примере ниже 20), мы посмотрим, где произошло событие касания, и отыщем ListBoxItem, который находится в этом месте, и установим IsSelected = ture для этого элемента.

private void myListBox_TouchUp(object sender, TouchEventArgs e)
{
    var difference = _maximum - _minimum;
    _maximum = 0;
    _minimum=0;
    if(difference < 20)
{
  var touchPosition = e.GetTouchPoint(myListBox)  
  UIElement elem = myListBox.InputHitTest(touchPosition.Position) as UIElement;

    while (elem != null)
    {
        if (elem == myListBox)
            return;
        ListBoxItem item = elem as ListBoxItem;
        if (item != null)
        {
            item.IsSelected = true;
            return;
        }
        elem = VisualTreeHelper.GetParent(elem) as UIElement;
    }
}
}

Это должно сработать.

person Gert Hermans    schedule 14.06.2013