我几乎把这件事与一件令人烦恼的事情分开了......
因为ListBox选择在鼠标按下时发生,如果在选择要拖动的最后一个项目时用鼠标向下开始拖动它可以正常工作,但是如果选择要先拖动的所有项目然后单击选择以开始拖动它,您单击的那个未被选中并在拖动后留下.
有关解决这个问题的最佳方法吗?
<DockPanel LastChildFill="True">
<ListBox ItemsSource="{Binding SourceItems}"
SelectionMode="Multiple"
PreviewMouseLeftButtonDown="HandleLeftButtonDown"
PreviewMouseLeftButtonUp="HandleLeftButtonUp"
PreviewMouseMove="HandleMouseMove"
MultiSelectListboxDragDrop:ListBoxExtension.SelectedItemsSource="{Binding SelectedItems}"/>
<ListBox ItemsSource="{Binding DestinationItems}"
AllowDrop="True"
Drop="DropOnToDestination"/>
<DockPanel>
Run Code Online (Sandbox Code Playgroud)
...
public partial class Window1
{
private bool clickedOnSourceItem;
public Window1()
{
InitializeComponent();
DataContext = new WindowViewModel();
}
private void DropOnToDestination(object sender, DragEventArgs e)
{
var viewModel = (WindowViewModel)
e.Data.GetData(typeof(WindowViewModel));
viewModel.CopySelectedItems();
}
private void HandleLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var sourceElement = (FrameworkElement)sender;
var hitItem = sourceElement.InputHitTest(e.GetPosition(sourceElement))
as FrameworkElement;
if(hitItem != null)
{
clickedOnSourceItem = true;
}
}
private void …Run Code Online (Sandbox Code Playgroud) 我有一个WPF Datagrid,我正在实现拖放功能.
datagrid有一个"文件"列表,用户可以拖动它们并将文件复制到桌面.
这样做是这样的:
string[] files = new String[myDataGrid.SelectedItems.Count];
int ix = 0;
foreach (object nextSel in myDataGrid.SelectedItems)
{
files[ix] = ((Song)nextSel).FileLocation;
++ix;
}
string dataFormat = DataFormats.FileDrop;
DataObject dataObject = new DataObject(dataFormat, files);
DragDrop.DoDragDrop(this.myDataGrid, dataObject, DragDropEffects.Copy);
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
1.当我想拖多物品─这是一个问题,因为在我选择一对夫妇,并开始点击一个开始dragging-只有被选中和其他项目将取消.我尝试了这里给出的解决方案但由于某种原因它不起作用.
2.我希望在复制后从数据网格中删除拖动的项目.问题是我不知道如何检查文件是否被复制,或者用户是否只是在屏幕上拖动它而不复制它.
我希望你能帮助我解决这些问题.
谢谢!