移植WinForms拖放到WPF拖放

Aus*_*ley 5 .net c# wpf winforms

我正在将我的程序从WinForms移植到WPF,并遇到了拖放问题.它应该允许从TreeView(它就像文件浏览器)拖动到打开文件的文本框.但是,WPF版本就像自动复制并粘贴了TreeViewItem标题文本.我想我只是混淆了什么?可能是DataObject东西.

功能齐全,相关的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);
         ...
Run Code Online (Sandbox Code Playgroud)

应该做同样事情的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?
}
Run Code Online (Sandbox Code Playgroud)

问题:在我的WPF版本中,我将文本框的文本设置为空(作为测试),但是之后会粘贴TreeViewItem的标题文本,这不是我想要的.

问题:将此WinForms代码移植到WPF的正确方法是什么?为什么文本被粘贴在WPF版本中?我该如何预防呢?我使用的是正确的事件吗?如何访问DataObjectin textbox_Drop以便我可以像在WinForms版本中那样打开文件?为什么TreeViewItem节点在WPF版本中始终为空?

小智 1

问题:在我的 WPF 版本中,我将文本框的文本设置为空(作为测试),这种情况发生了,但随后粘贴了 TreeViewItem 的标题文本,这不是我想要的。

我认为父 UI 元素正在处理(因此覆盖)该Drop事件,因此您不会获得预期的结果。事实上,当尝试重新创建您的问题时,我什至无法触发 TextBox.Drop 事件。但是,使用 TextBox 的 PreviewDrop 事件,我能够得到(我认为)您的预期结果。尝试这个:

    private void textBox1_PreviewDrop(object sender, DragEventArgs e)
    {
        TextBox tb = sender as TextBox;
        if (tb != null)
        {
            // If the DataObject contains string data, extract it.
            if (e.Data.GetDataPresent(DataFormats.StringFormat))
            {
                string fileName = e.Data.GetData(DataFormats.StringFormat) as string;
                using (StreamReader s = File.OpenText(fileName))
                {
                    ((TextBox)sender).Text = s.ReadToEnd();
                }
            }
        }
        e.Handled = true; //be sure to set this to true
    }
Run Code Online (Sandbox Code Playgroud)

我认为代码片段应该回答您提出的大部分问题,除了这个:

为什么WPF版本中TreeViewItem节点总是为空?

DataObject在 DragDrop 事件中传递的不支持传递TreeViewItem. 在您的代码(和我的代码)中,我们指定数据格式不能DataFormats.StringFormat转换为TreeViewItem.