2013-06-13 3 views
1

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

У меня есть SelectionChanged событие на ListBox

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

С удаленной отладкой я видел, что все события TouchDown, TouchMove и TouchUp запускаются, но несколько раз функция selectionChanged не запускается.

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

ScrollViewer.PanningMode="None" 

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

необходима помощь.

ответ

3

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

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), мы посмотрим, где произошло событие touchup, и найдите 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; 
    } 
} 
} 

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

Смежные вопросы