我將我的程序從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