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.
| 归档时间: |
|
| 查看次数: |
1378 次 |
| 最近记录: |