Wpf 拖动并选择列表框项目?

Wpf 拖动并选择列表框项目?,wpf,Wpf,如何在列表框中选择项目,如果开始从一个项目拖动到拖动的末尾?我在msdn的一个问题上找到了这种方法,但我无法再次找到它,因此无法链接它。。不管怎么说,这工作得很好,唯一的问题是当同时拖动和滚动时,它可能会丢失一些项目。我创建了一个名为MultiSelectLibrary的自定义控件库,您可以像这样使用它 添加对MultiSelectLibrary的引用,该库可从(源)下载 使用SelectionMode=“Extended”添加名称空间和MultiSelectListBox,它应该可以工作 xm

如何在列表框中选择项目,如果开始从一个项目拖动到拖动的末尾?

我在msdn的一个问题上找到了这种方法,但我无法再次找到它,因此无法链接它。。不管怎么说,这工作得很好,唯一的问题是当同时拖动和滚动时,它可能会丢失一些项目。我创建了一个名为MultiSelectLibrary的自定义控件库,您可以像这样使用它

添加对MultiSelectLibrary的引用,该库可从(源)下载
使用SelectionMode=“Extended”添加名称空间和MultiSelectListBox,它应该可以工作

xmlns:mslb="clr-namespace:MultiSelectLibrary.MultiSelectListBox;assembly=MultiSelectLibrary"

<mslb:MultiSelectListBox SelectionMode="Extended" .../>
xmlns:mslb=“clr命名空间:MultiSelectLibrary.MultiSelectListBox;assembly=MultiSelectLibrary”
如果您只想使用一些代码,您可以这样做(做与库相同的事情)


在代码背后

private object _anchor, _lead;
private Boolean _inMouseSelectionMode;
private List<object> _selectedItems = new List<object>();

private void ListBoxItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    _selectedItems.Clear();
    _inMouseSelectionMode = false;
    _anchor = null;
    _lead = null;
}

private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
        return;

    _anchor = sender;
    _inMouseSelectionMode = true;
    _selectedItems.Clear();
    _selectedItems.Add(sender);
}
private void ListBoxItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if (!_inMouseSelectionMode)
        return;

    if (_lead != sender)
    {
        var last = _lead;
        _lead = sender;

        if (_selectedItems.Contains(_lead))
            _selectedItems.Remove(last);
        else
            _selectedItems.Add(_lead);
    }

    foreach (var item in _selectedItems)
        ((ListBoxItem)item).IsSelected = true;
}
private object\u-anchor,\u-lead;
私有布尔_InmouseSelection模式;
私有列表_selectedItems=新列表();
private void ListBoxItem_PreviewMouseUp(对象发送器,鼠标按钮Ventargs e)
{
_选择editems.Clear();
_inMouseSelectionMode=false;
_anchor=null;
_铅=零;
}
私有无效ListBoxItem_预览鼠标左键向下(对象发送器,鼠标按钮Ventargs e)
{
if(Keyboard.IsKeyDown(Key.LeftCtrl)| | Keyboard.IsKeyDown(Key.RightCtrl))
返回;
_锚=发送方;
_inMouseSelectionMode=true;
_选择editems.Clear();
_选择EditEMS.Add(发件人);
}
private void ListBoxItem_PreviewMouseMove(对象发送者,鼠标目标)
{
如果(!\u InMouseSelection模式)
返回;
如果(_lead!=发送方)
{
var last=_lead;
_铅=发送者;
如果(_selectedItems.Contains(_lead))
_选择编辑项。删除(最后一个);
其他的
_选择编辑项。添加(\u lead);
}
foreach(选择编辑项中的变量项)
((ListBoxItem)项).IsSelected=true;
}

默认情况下,这不适用于您?您的意思是像
Windows资源管理器中的
框选择
?简单地说,如果我从元素5拖动到元素10,我想将这些项目标记为选中?您可以按住Shift键并选择。制作列表框
SelectionMode=“Extended”
,否则,您必须通过获取每个项目的命中测试来手动选择项目。感谢您的分享,Meleak,我将深入研究代码,因为我想要类似的东西。如何在我选择的内容上绘制框架?@Anders Rune Jensen:你说得对,不确定发生了什么。我会调查的@@Anders Rune Jensen:目前MediaFire似乎存在问题。。我再次上传并更新了链接,让我们看看它是否有用这有问题。如果拖得太快,则选择中会出现间隙!
private object _anchor, _lead;
private Boolean _inMouseSelectionMode;
private List<object> _selectedItems = new List<object>();

private void ListBoxItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    _selectedItems.Clear();
    _inMouseSelectionMode = false;
    _anchor = null;
    _lead = null;
}

private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
        return;

    _anchor = sender;
    _inMouseSelectionMode = true;
    _selectedItems.Clear();
    _selectedItems.Add(sender);
}
private void ListBoxItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if (!_inMouseSelectionMode)
        return;

    if (_lead != sender)
    {
        var last = _lead;
        _lead = sender;

        if (_selectedItems.Contains(_lead))
            _selectedItems.Remove(last);
        else
            _selectedItems.Add(_lead);
    }

    foreach (var item in _selectedItems)
        ((ListBoxItem)item).IsSelected = true;
}