簡體   English   中英

WPF將文件從Windows資源管理器拖放到TreeView上

[英]WPF drag and drop files onto TreeView from windows explorer

我試圖制作一個非常簡單的,或者我認為,程序將文件從桌面/資源管理器拖放到wpf樹視圖上。

這個例子中的樹視圖很簡單,所以我可以隔離我遇到的拖放問題。 我已將AllowDrop設置為整個地方的True,我仍然無法觸發Drop或DragOver事件。 我專注於樹視圖控件,因為我希望能夠將文件拖動到具有分層結構的不同節點中。 現在,當我將文件拖到樹視圖上時,我會滿足於能夠觸發DragOver或Drop事件。

我通過查看這樣的示例開始: 在Treeview中拖放

我的問題與此類似: 將瀏覽器中的文件拖放到Telerik WPF樹視圖中 但是我使用的是wpf treeview,而不是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>

碼:

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; }
}
}

編輯我加粗了解釋我的問題的文本,因為事件沒有解雇。

我將我的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"/>

然而,當添加DataTemplate時,就是黑色圓圈開始出現的時候。 這必須是某種數據綁定問題?

編輯我現在開始到某個地方。

我將我的xaml更改為this並且事件開始觸發:

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

編輯我發現如果我從表達式混合運行項目,我只能拖放到stackpanel。 如果我從visual studio運行它,它會顯示黑色圓圈,並在其中顯示一條直線。 這根本沒有任何意義。 對於這個單獨的問題,我在這里開始了另一個問題: 在調試或重新運行的Visual Studio 2010 WPF項目將不允許拖放到任何控件

這都是因為以管理員身份運行visual studio。 顯然,對於notepad.exe也是如此,如果您以管理員身份運行某些內容,則無法拖放。 所以現在對於IIS調試我必須以管理員身份運行並且拖放我需要弄清楚如何在正常模式下運行...

我認為問題是你沒有在TreeViewItems上拖動項目。 這是必要的,因為您的事件僅為TreeViewItems注冊。 如果要拖放到樹的父級別,則需要將相應的事件添加到樹中。

此解決方案將遇到的問題是TreeView事件將首先觸發。 所以現在你必須知道你正在哪個節點才能正確添加它。 有解決方案可以確定您所在的節點。 但是,我建議在樹中添加一個始終存在的頂級元素。 然后像往常一樣將事件連接到TreeViewItems。 這樣,您可以在頂級添加而無需處理TreeView事件,因為您可以拖動到該頂級項目。

下面是我用來測試它的內容,如果我直接拖到TreeViewItems上,我就會看到斷點。 您可能無法識別某些名稱空間,但這是因為它引用了我的項目。

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)
  {

  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM