2013-06-13 2 views
1

타블렛에서 WPF 목록 상자를 사용하려고합니다. 더미 프로젝트에서 방금 많은 항목이있는 목록 상자를 만들었고 하나를 선택하면이 항목이 텍스트 블록에 표시됩니다. WPF ListBox Selection 태블릿에서 단발적으로 변경되지 않았습니다.

내가가 예상대로 작동 내 노트북 ​​모두에 목록 상자

에 따라 selectionChanged 이벤트를하지만 난 태블릿에서 실행시에서 selectionChanged 이벤트가 산발적으로 트리거되지 않습니다. 화면에서 이전 선택한 항목은 선택된 상태로 유지되고 새로 선택한 항목은 강조 표시되지만 항목은 텍스트 블록에 표시되지 않습니다.

원격 디버깅을 통해 TouchDown, TouchMove 및 TouchUp 이벤트가 모두 트리거되지만 selectionChanged가 트리거되지 않는 경우가 있습니다.

나뿐만 아니라 시도했습니다 이러한 것들 : 목록 상자 내부 XAML에서 설정 :

ScrollViewer.PanningMode="None" 

나는 이것을에서 selectionChanged 이벤트가 항상 트리거되지만 사용자가 (강타로 더 이상 아래로 스크롤 할 수 없습니다 수행 할 때 어떤 수 있어야한다. 내가 여기 생각 어딘가에 문제가있다,하지만 난 아직 해결책이 없습니다.

도움이 필요.

답변

3

이 문제에 대한 해결책이 발견 오랜 시간 후.우리의 첫 번째제게 목록 상자의하는 TouchMove 이벤트를 잡을 필요가 몇 가지 변수

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

이 필요합니다. 이 이벤트는 여러 번 트리거됩니다. 우리는 터치의 최대 및 최소 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; 
    } 
} 
} 

이렇게하면됩니다.