1

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

我在 listBox 上有一个 selectionchanged 事件

在我的笔记本电脑上,一切正常,但是当我在平板电脑上运行它时,selectionchanged 事件不会偶尔触发。在屏幕上,旧的选定项目保持选中状态,新选定的项目突出显示,但该项目未显示在文本块中。

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

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

ScrollViewer.PanningMode="None"

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

需要帮助。

4

1 回答 1

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;
    }
}
}

这应该有效。

于 2013-06-14T12:10:30.483 回答