【发布时间】:2020-06-25 16:20:06
【问题描述】:
我有一个 ListBox,它通过按住鼠标左键拖动来水平滑动其 ScrollViewer。
private ScrollViewer scrollViewer;
private Point scrollMousePoint = new Point();
private double horizontalOffset = 1;
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Border border = (Border)VisualTreeHelper.GetChild(myListBox, 0);
scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
// This works
}
private void myListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
scrollMousePoint = e.GetPosition(scrollViewer);
horizontalOffset = scrollViewer.HorizontalOffset;
scrollViewer.CaptureMouse();
// This works
}
private void myListBox_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (scrollViewer.IsMouseCaptured)
scrollViewer.ScrollToHorizontalOffset(horizontalOffset + (scrollMousePoint.X - e.GetPosition(scrollViewer).X));
// This works
}
private void myListBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
scrollViewer.ReleaseMouseCapture();
if (scrollMousePoint == Mouse.GetPosition(scrollViewer))
{
// Click
// Here I want to get and select the ListBoxItem that was pressed.
}
}
我想获取并选择被点击的 ListBoxItem。
为了判断是否是没有移动的点击,我比较了PreviewMouseLeftButtonDown和PreviewMouseLeftButtonUp事件中保存的位置是否相同。
【问题讨论】:
-
那不是选中项吗?
-
myListBox_PreviewMouseLeftButtonDown 事件中的 CaptureMouse 阻止了 ListBoxItem 的选择
-
我会尝试推迟捕获鼠标。 Dispatcher.invokeasync 那部分。
-
我找不到一种方法来检测点击是否没有拖动,推迟 CaptureMouse
-
您是否尝试过标记为按住鼠标按钮而不是捕获鼠标?鼠标按下时设置为真,鼠标抬起时设置为假。检查 mousemove 中的标志。