WPF ListBox SelectionChanged偶尔不会在平板电脑上触发

时间:2013-06-13 09:10:16

标签: wpf listbox touch selectionchanged

我正在尝试在平板电脑上使用WPF列表框。 在一个虚拟项目中,我刚刚创建了一个包含大量项目的列表框,当我选择一个时,这个项目将显示在一个文本块中。

我在listBox上有一个selectionchanged事件

在我的笔记本电脑上,一切都按照应有的方式运行,但是当我在平板电脑上运行时,不会偶尔触发selectionchanged事件。在屏幕上,旧的所选项目保持选中状态,新选择的项目将突出显示,但该项目未显示在文本块中。

通过远程调试,我看到触发了TouchDown,TouchMove和TouchUp事件,但有时未触发selectionChanged。

我尝试过的这些事情: 在列表框内的Xaml中设置:

ScrollViewer.PanningMode="None"

当我这样做时,总是触发selectionchanged事件,但是用户不能再向下滚动(这必须是可能的)。 我认为这里存在问题,但我还没有任何解决方案。

需要帮助。

1 个答案:

答案 0 :(得分:3)

经过很长一段时间,找到了解决这个问题的方法。 首先我们需要一些变量

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

我需要捕获listBox的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;
}

现在,在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;
    }
}
}

这应该有用。