我将我的程序从WinForms移植到WPF,并遇到了一些拖放问题。它应该允许从一个TreeView(它就像一个文件浏览器)拖到一个打开文件的文本框。但是,WPF版本的行为就像是自动复制并粘贴TreeViewItem
的标题文本。我想我只是混合了一些东西?可能是DataObject
的东西。移植WinForms拖放到WPF的拖放
全功能的,相关的WinForms代码:
private void treeView1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
TreeNode node = treeView1.GetNodeAt(e.Location);
if (node != null) treeView1.DoDragDrop(node, DragDropEffects.Move);
}
textbox[i].DragDrop += (o, ee) =>
{
if (ee.Data.GetDataPresent(typeof(TreeNode)))
{
TreeNode node = (TreeNode)ee.Data.GetData(typeof(TreeNode));
((Textbox)o).Text = File.ReadAllLines(pathRoot + node.Parent.FullPath);
...
的WPF代码应该做同样的事情:
private void TreeView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
TreeViewItem item = e.Source as TreeViewItem;
if (item != null)
{
DataObject dataObject = new DataObject();
dataObject.SetData(DataFormats.StringFormat, GetFullPath(item));
DragDrop.DoDragDrop(item, dataObject, DragDropEffects.Move);
}
}
//textbox[i].PreviewDrop += textbox_Drop;
private void textbox_Drop(object sender, DragEventArgs e)
{
TreeViewItem node = (TreeViewItem)e.Data.GetData(typeof(TreeViewItem)); //null?
((Textbox)sender).Text = "";
//this is being executed BUT then the node's header text is being pasted
//also, how do I access the DataObject I passed?
}
问题:在我的WPF的版本,我设置文本框的文本为空(作为测试),这发生,但之后TreeViewItem的标题文本被粘贴,这不是我想要的。
问题:将此WinForms代码移植到WPF的正确方法是什么?为什么文本被粘贴在WPF版本中?我如何防止这种情况发生?我使用正确的事件吗?我如何在textbox_Drop
中访问DataObject
,以便像我在WinForms版本中那样打开文件?为什么TreeViewItem节点在WPF版本中始终为空?
这似乎是相关的:http://msdn.microsoft.com/en-us/library/hh144798.aspx编辑:这里最重要的一点是,'文本框'和它所有的亲属都有DragDrop的“默认”实现,并且建议你将它们拧紧,而不是旋转自己的。 – JerKimball