我正在尝试制作一个非常简单的程序,或者我认为的程序,将文件从桌面/资源管理器拖放到 wpf 树视图上。
此示例中的树视图很简单,因此我可以隔离遇到的拖放问题。我已经将所有地方的AllowDrop设置为True,但我仍然无法触发Drop或DragOver事件。我专注于树视图控件,因为我希望能够将文件拖到具有分层结构的不同节点中。现在,我只想在将文件拖到树视图上时触发 DragOver 或 Drop 事件。
我首先看的是这样的例子:在树视图中拖放 https://stackoverflow.com/questions/1026179/drag-drop-in-treeview-wpf
我的问题与此类似:将文件从资源管理器拖放到 Telerik WPF 树视图上 https://stackoverflow.com/questions/6094488/drag-drop-files-from-explorer-onto-telerik-wpf-treeview。不过我使用的是 wpf 树视图,而不是 telerik 树视图。
这是我到目前为止的代码
XAML:
<Window x:Class="WpfDragAndDropTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfDragAndDropTest"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView Name="TreeView1">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" >
<Setter Property="TreeViewItem.AllowDrop" Value="True"/>
<EventSetter Event="TreeViewItem.DragOver" Handler="TreeView1_DragOver" />
<EventSetter Event="TreeViewItem.Drop" Handler="TreeView1_Drop" />
<EventSetter Event="TreeViewItem.MouseMove" Handler="TreeView1_MouseMove" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<DataTemplate DataType="{x:Type local:TestClass}">
<StackPanel Orientation="Vertical" >
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=Url}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
</Window>
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfDragAndDropTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TreeView1.ItemsSource = new[]
{
new TestClass { Title = "Google", Url = "http://www.google.com" },
new TestClass { Title = "Microsoft", Url = "http://www.microsoft.com" },
new TestClass{ Title="Netflix", Url="http://www.netflix.com" }
};
}
private void TreeView1_Drop(object sender, DragEventArgs e)
{
}
private void TreeView1_DragOver(object sender, DragEventArgs e)
{
}
private void TreeView1_MouseMove(object sender, MouseEventArgs e)
{
}
}
public class TestClass
{
public string Title { get; set; }
public string Url { get; set; }
}
}
Edit我用粗体显示了我的问题的文本,因为事件没有触发。
我将我的 xaml 切换到此,当将文件拖动到树视图上时,我仍然得到一个带有线的黑色圆圈,并且唯一触发的事件是 MouseMove。如果我使用鼠标执行这些操作,则不会触发拖放操作。
<TreeView Name="TreeView1" AllowDrop="True" DragOver="TreeView1_DragOver" Drop="TreeView1_Drop" MouseMove="TreeView1_MouseMove">
<TreeView.Resources>
<DataTemplate DataType="{x:Type local:TestClass}">
<StackPanel Orientation="Vertical" >
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=Url}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
Edit我尝试了一个空白的树视图,并且能够将文件拖到上面,并且光标不是带有线的黑色圆圈。
<TreeView Height="312" Background="#FFCFDBF9" AllowDrop="True"/>
但是,当将该 DataTemplate 添加到其中时,黑色圆圈开始出现。这一定是某种数据绑定问题?
Edit我现在开始有所进展了。
我将我的 xaml 更改为这样,事件开始触发:
<TreeView Name="TreeView1" Background="#FFC9D7FF">
<TreeView.Resources>
<DataTemplate DataType="{x:Type local:TestClass}">
<StackPanel Orientation="Vertical" AllowDrop="True" DragOver="TreeView1_DragOver" Drop="TreeView1_Drop" MouseMove="TreeView1_MouseMove" >
<TextBlock Text="{Binding Path=Title}" />
<TextBlock Text="{Binding Path=Url}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
edit我发现,如果我从表达式混合运行项目,则只能拖放到堆栈面板。如果我从 Visual Studio 运行它,它会显示带有一条线的黑色圆圈。这根本没有任何意义。对于这个单独的问题,我在这里开始了另一个问题: 在调试或发布中运行的 Visual Studio 2010 WPF 项目将不允许拖放到任何控件 https://stackoverflow.com/questions/7485909/visual-studio-2010-wpf-project-ran-in-debug-or-relase-will-not-allow-drag-and-dro
这都是由于以管理员身份运行 Visual Studio 造成的。显然,notepad.exe 也是如此,如果您以管理员身份运行某些内容,则无法拖放。所以现在对于 IIS 调试,我必须以管理员身份运行,对于拖放,我需要弄清楚如何在正常模式下运行......