我正在尝试在平板电脑上使用WPF列表框。 在一个虚拟项目中,我刚刚创建了一个包含大量项目的列表框,当我选择一个时,这个项目将显示在一个文本块中。
我在listBox上有一个selectionchanged事件
在我的笔记本电脑上,一切都按照应有的方式运行,但是当我在平板电脑上运行时,不会偶尔触发selectionchanged事件。在屏幕上,旧的所选项目保持选中状态,新选择的项目将突出显示,但该项目未显示在文本块中。
通过远程调试,我看到触发了TouchDown,TouchMove和TouchUp事件,但有时未触发selectionChanged。
我尝试过的这些事情: 在列表框内的Xaml中设置:
ScrollViewer.PanningMode="None"
当我这样做时,总是触发selectionchanged事件,但是用户不能再向下滚动(这必须是可能的)。 我认为这里存在问题,但我还没有任何解决方案。
需要帮助。
答案 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;
}
}
}
这应该有用。