Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF从windows资源管理器将文件拖放到TreeView上_C#_Wpf_Treeview_Wpf Controls - Fatal编程技术网

C# WPF从windows资源管理器将文件拖放到TreeView上

C# WPF从windows资源管理器将文件拖放到TreeView上,c#,wpf,treeview,wpf-controls,C#,Wpf,Treeview,Wpf Controls,我正在尝试制作一个非常简单的程序,或者我想的那样,将文件从桌面/浏览器拖放到wpf树视图上 本例中的treeview非常简单,因此我可以隔离我遇到的拖放问题。我已经将AllowDrop设置为True,但我仍然无法启动Drop或DragOver事件。我专注于treeview控件,因为我希望能够将文件拖动到具有层次结构的不同节点中。现在,当我把一个文件拖到树状视图上时,我只能满足于让DragOver或Drop事件触发 我从以下示例开始: 我的问题和这个类似:。然而,我使用的是wpf treeview

我正在尝试制作一个非常简单的程序,或者我想的那样,将文件从桌面/浏览器拖放到wpf树视图上

本例中的treeview非常简单,因此我可以隔离我遇到的拖放问题。我已经将AllowDrop设置为True,但我仍然无法启动Drop或DragOver事件。我专注于treeview控件,因为我希望能够将文件拖动到具有层次结构的不同节点中。现在,当我把一个文件拖到树状视图上时,我只能满足于让DragOver或Drop事件触发

我从以下示例开始:

我的问题和这个类似:。然而,我使用的是wpf treeview,而不是telerik

这是我到目前为止的代码

XAML:


代码:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
命名空间wpfdragandroptest
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
TreeView1.ItemsSource=new[]
{ 
新的测试类{Title=“谷歌”,Url=”http://www.google.com" }, 
新测试类{Title=“Microsoft”,Url=”http://www.microsoft.com" },
新测试类{Title=“Netflix”,Url=”http://www.netflix.com" }
};
}
私有void树视图1_Drop(对象发送器,DragEventArgs e)
{
}
私有void TreeView1_DragOver(对象发送方,DragEventArgs e)
{
}
私有void TreeView1_MouseMove(对象发送器,MouseEventArgs e)
{
}
}
公共类TestClass
{
公共字符串标题{get;set;}
公共字符串Url{get;set;}
}
}
编辑 我用粗体字说明了我的问题,即事件未触发

我将我的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>

编辑 我尝试了一个空白的树状视图,并且能够在上面拖动一个文件,而光标不是一条线穿过的黑色圆圈

<TreeView Height="312" Background="#FFCFDBF9" AllowDrop="True"/>

然而,当数据模板被添加到其中时,黑色圆圈开始出现。这一定是某种数据绑定问题

编辑 我现在开始有所进展了

我将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>

编辑 我发现,如果从expression blend运行项目,我只能拖放到stackpanel。如果我从VisualStudio运行它,它会显示一条线穿过的黑色圆圈。那完全没有道理。对于这个单独的问题,我在这里开始了另一个问题:


这都是由于以管理员身份运行VisualStudio造成的。显然,notepad.exe也是如此,如果您以管理员身份运行某些东西,则无法拖放。所以现在对于IIS调试,我必须以管理员身份运行,对于拖放,我需要弄清楚如何在正常模式下运行

我认为问题在于您没有将项目拖到树状视图项本身上。这是必需的,因为您的事件仅为TreeViewItems注册。如果要拖放到树的父级,则需要将相应的事件添加到树中

这个解决方案的问题是TreeView事件将首先触发。因此,现在您必须知道要正确添加它的节点。有一些解决方案可以确定您在哪个节点上。但是,我建议在树中添加一个始终存在的顶级元素。然后将事件连接到树上,就像你一样。这样,您就可以在顶级添加,而不必处理TreeView事件,因为您可以拖动到该顶级项

下面是我用来测试它的,如果我直接拖动到treeviewitem上,我会看到断点。您可能无法识别某些名称空间,但这是因为它引用了我的项目

XAML:

  <TreeView x:Name="treeView">
     <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}" >
           <Setter Property="TreeViewItem.AllowDrop" Value="True"/>
           <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver" />
           <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop" />
           <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove" />
        </Style>
     </TreeView.ItemContainerStyle>

     <TreeView.Resources>
        <DataTemplate DataType="{x:Type FileExplorerDragDrop:TestClass}">
           <StackPanel Orientation="Vertical"  >
              <TextBlock Text="{Binding Path=Title}" />
              <TextBlock Text="{Binding Path=Url}" />
           </StackPanel>
        </DataTemplate>
     </TreeView.Resources>
  </TreeView>  
  public MainWindow()
  {
     InitializeComponent();

     treeView.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 treeViewItem_DragOver(object sender, DragEventArgs e)
  {

  }

  private void treeViewItem_Drop(object sender, DragEventArgs e)
  {

  }

  private void treeViewItem_MouseMove(object sender, MouseEventArgs e)
  {

  }

你认为如何才能让它工作?你在TreeView1_Drop里面有问题吗?如果是这样,请解释您需要什么并显示您尝试了什么,开始检查DragEventArgs e对象的属性,并在调试时查看它包含什么以及如何使用它来获得所需的内容。对于你留下空白的其他事件也是如此……我在问题的粗体部分指出问题在于事件没有触发。谢谢。您是否将拖放的accept item变量设置为true?我已经编辑了这个问题,将重点放在让事件在树视图上触发上。我将事件重新调到treeview,并删除了treeview项目上的事件设置程序。一定有一些非常简单的东西我错过了。当我把文件拖到树状视图上时,我得到的是一个黑色的圆圈,上面有一条线穿过。释放文件似乎不会导致灾难恢复
  <TreeView x:Name="treeView">
     <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}" >
           <Setter Property="TreeViewItem.AllowDrop" Value="True"/>
           <EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver" />
           <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop" />
           <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove" />
        </Style>
     </TreeView.ItemContainerStyle>

     <TreeView.Resources>
        <DataTemplate DataType="{x:Type FileExplorerDragDrop:TestClass}">
           <StackPanel Orientation="Vertical"  >
              <TextBlock Text="{Binding Path=Title}" />
              <TextBlock Text="{Binding Path=Url}" />
           </StackPanel>
        </DataTemplate>
     </TreeView.Resources>
  </TreeView>  
  public MainWindow()
  {
     InitializeComponent();

     treeView.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 treeViewItem_DragOver(object sender, DragEventArgs e)
  {

  }

  private void treeViewItem_Drop(object sender, DragEventArgs e)
  {

  }

  private void treeViewItem_MouseMove(object sender, MouseEventArgs e)
  {

  }