2013-06-13 37 views
1

我想在平板電腦上使用WPF列表框。 在一個虛擬項目中,我剛剛製作了一個包含很多項目的列表框,當我選擇一個項目時,它將顯示在一個文本塊中。WPF ListBox SelectionChanged零星沒有在平板電腦上觸發

我在列表框

在我的筆記本電腦一切SelectionChanged事件的工作應該的方式,但是當我在平板電腦上運行它不會偶爾觸發SelectionChanged事件。在屏幕上,舊的選定項目保持選中狀態,新選中的項目將突出顯示,但該項目不顯示在文本塊中。

通過遠程調試,我看到TouchDown,TouchMove和TouchUp事件全部被觸發,但有時候selectionChanged沒有被觸發。

這些東西我已經試過,以及:在XAML列表框裏面 設置:

ScrollViewer.PanningMode="None" 

當我這樣做SelectionChanged事件總是被觸發,但用戶不能再向下滑動與滾動(它必須是可行的。 我覺得這裏的某個地方存在着問題,但我沒有任何解決辦法呢。

幫助需要。

回答

3

後很長一段時間這個問題找到了解決辦法。 第一,我們都需要一些變量

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

我需要趕上列表框的TouchMove事件。此事件觸發很多次。我們需要獲得觸摸所能達到的最大和最小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; 
} 

現在在觸上事件,我們看多遠都在垂直方向上被滑動。如果這不是很大(在這個例子中低於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; 
    } 
} 
} 

這應該有效。

相關問題