我想在 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