【问题标题】:Get and Select the ListBoxItem clicked from ListBox_PreviewMouseLeftButtonUp event获取并选择从 ListBox_PreviewMouseLeftButtonUp 事件中单击的 ListBoxItem
【发布时间】: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 中的标志。

标签: c# wpf


【解决方案1】:

给你:

        private void myListBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            scrollViewer.ReleaseMouseCapture();

            if (scrollMousePoint == Mouse.GetPosition(scrollViewer))
            {
                ListBox listBox = sender as ListBox;
                if (listBox != null)
                {
                    var element = VisualTreeHelper.HitTest(listBox, scrollMousePoint).VisualHit;
                    if (element.GetType() != typeof(ScrollViewer))
                    {
                        while (element.GetType() != typeof(ListBoxItem))
                            element = VisualTreeHelper.GetParent(element);

                        (element as ListBoxItem).IsSelected = true;
                    }
                }
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多