1

我想在 wpf 水平列表框中实现项目的橡皮筋选择。原则上它可以工作,除了列表中有许多项目外,当鼠标也移动到控件下方时,程序会长时间冻结甚至永远冻结。这是最简单的重现代码:

<Window x:Class="DemonstrateWpfDeadlock.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <ListBox SelectionMode="Multiple" ItemsSource="{Binding .}" VerticalAlignment="Top" 
             MouseDown="List_OnMouseDown"
             MouseUp="List_OnMouseUp">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal" IsItemsHost="True" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>
</Grid>

和后面的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var objs = new List<string>();
        for (int i =0; i < 10000; i++)
            objs.Add(i.ToString());
        DataContext = objs;
    }

    private void List_OnMouseDown(object sender, MouseButtonEventArgs e)
    {
        Mouse.Capture((IInputElement) sender);
    }

    private void List_OnMouseUp(object sender, MouseButtonEventArgs e)
    {
        ((IInputElement)sender).ReleaseMouseCapture();
    }
}

将鼠标拖动到控件下方时,它会冻结。将 StackPanel 设置为垂直时,一切都很顺利!但不幸的是,它必须是水平的。这是Wpf中的一个怪癖吗?有解决方法吗?我尝试使用 .NET 4.8 而不是 4.6.1 但没有变化。视窗 10 1903 x64

4

0 回答 0