2011-09-19 31 views
6

Tôi đang cố gắng thực hiện một chương trình cực kỳ đơn giản, hoặc vì vậy tôi nghĩ, để kéo và thả tệp từ máy tính để bàn/thám hiểm vào một wpf treeview.WPF kéo và thả tập tin vào TreeView từ windows explorer

Số lần xem trong ví dụ này rất đơn giản để tôi có thể tách rời sự cố kéo và thả mà tôi đang gặp phải. Tôi đã đặt AllowDrop bằng True ở khắp mọi nơi, tôi vẫn không thể nhận được sự kiện Drop hoặc DragOver để kích hoạt. Tôi tập trung vào kiểm soát treeview vì tôi muốn có thể kéo tệp vào các nút khác nhau với cấu trúc phân cấp. Ngay bây giờ tôi sẽ giải quyết cho chỉ có thể nhận được các sự kiện DragOver hoặc Drop để kích hoạt khi tôi kéo một tệp vào treeview.

Tôi đã nhận được bắt đầu bằng cách nhìn vào ví dụ như thế này: Drag & Drop in Treeview

Câu hỏi của tôi là tương tự với trang này: Drag drop files from explorer onto Telerik WPF treeview. Tuy nhiên tôi đang sử dụng wpf treeview, không phải là một telerik.

Dưới đây là đoạn code tôi có cho đến nay

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

Sửa tôi in đậm văn bản nêu rõ các vấn đề của tôi như các sự kiện không bắn.

Tôi đã chuyển xaml của mình thành thứ này và tôi vẫn nhận được một vòng tròn màu đen với một đường thẳng qua nó khi kéo một tệp trên treeview và sự kiện duy nhất kích hoạt là MouseMove. Kéo và thả không kích hoạt nếu tôi sử dụng chuột để thực hiện các thao tác đó.

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

Sửa Tôi đã thử một treeview trống và đã có thể kéo một file trên nó, và con trỏ không phải là vòng tròn màu đen với dòng qua nó.

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

Tuy nhiên khi đó DataTemplate được thêm vào nó, đó là khi vòng tròn màu đen bắt đầu hiển thị. Điều này phải là một số loại vấn đề databinding?

Chỉnh sửa Tôi đang bắt đầu đi đến một nơi nào đó ngay bây giờ.

tôi đã thay đổi XAML của tôi để này và các sự kiện bắt đầu bắn:

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

chỉnh sửa tôi đã phát hiện ra rằng tôi chỉ có thể kéo và thả vào stackpanel nếu tôi chạy dự án từ biểu hiện sự pha trộn. Nếu tôi chạy nó từ studio trực quan, nó cho thấy vòng tròn màu đen với một đường xuyên qua nó. Điều đó không có ý nghĩa gì cả. Đối với vấn đề riêng biệt này, tôi đã bắt đầu một câu hỏi khác tại đây:Visual Studio 2010 WPF Project ran in debug or relase will not allow drag and drop to any control

Đây là tất cả do chạy studio trực quan làm quản trị viên. Rõ ràng điều tương tự cũng đúng với notepad.exe, nếu bạn chạy một cái gì đó với tư cách quản trị viên, bạn không thể kéo và thả. Vì vậy, bây giờ cho IIS gỡ lỗi tôi phải chạy như quản trị viên và cho kéo và thả tôi cần phải tìm ra cách để chạy ở chế độ bình thường ...

+0

làm thế nào để bạn tưởng tượng bao giờ làm việc này? bạn có vấn đề gì bên trong TreeView1_Drop không? nếu có, giải thích những gì bạn cần và hiển thị những gì bạn đã thử, bắt đầu kiểm tra các thuộc tính của đối tượng e DragEventArgs và xem tại thời điểm gỡ lỗi những gì nó chứa và cách bạn có thể sử dụng nó để có được những gì bạn cần. tương tự cho những sự kiện khác mà bạn để trống ... –

+0

Tôi đã in đậm phần câu hỏi cho biết vấn đề là sự kiện không kích hoạt. Cảm ơn. – 249076

+0

Bạn có đang đặt biến mục chấp nhận của thả và kéo sang đúng không? –

Trả lời

1

Tôi nghĩ rằng vấn đề là bạn không kéo mục trên chính TreeViewItems. Điều này là cần thiết vì các sự kiện của bạn chỉ được đăng ký cho TreeViewItems. Nếu bạn muốn kéo và thả vào cấp độ gốc của cây bạn, bạn sẽ cần phải thêm các sự kiện tương ứng vào cây của bạn.

Sự cố bạn sẽ gặp phải với giải pháp này là sự kiện TreeView sẽ kích hoạt trước. Vì vậy, bây giờ bạn sẽ phải biết nút bạn đang ở trên để thêm nó đúng cách. Có các giải pháp để tìm ra nút nào bạn đã kết thúc. Tuy nhiên, tôi sẽ đề nghị thêm một yếu tố cấp cao nhất cho cây của bạn luôn ở đó. Sau đó kết nối các sự kiện với TreeViewItems như bạn. Bằng cách đó, bạn có thể thêm ở cấp cao nhất mà không phải xử lý các sự kiện TreeView vì bạn có thể kéo đến mục cấp cao nhất đó.

Dưới đây là những gì tôi đã sử dụng để kiểm tra nó ra và tôi nhìn thấy các điểm ngắt nếu tôi kéo trực tiếp trên TreeViewItems. Bạn có thể không nhận ra một số không gian tên nhưng đó là vì nó đề cập đến dự án của tôi.

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> 

Mã đằng sau:

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

    } 
+0

Tôi đã chỉnh sửa câu hỏi để tập trung vào việc nhận các sự kiện để kích hoạt trên treeview. Tôi đã tổ chức lại các sự kiện cho treeview, và đã loại bỏ các bộ giải quyết sự kiện trên treeviewitems. Phải có một cái gì đó vô cùng đơn giản mà tôi đang thiếu. Khi tôi kéo tập tin trên treeview tất cả tôi nhận được là một vòng tròn màu đen với một dòng thông qua nó. Việc phát hành tệp có vẻ không gây ra Sự kiện thả để kích hoạt. Nếu tôi có thể nhận được sự kiện đó để bắn tôi có thể làm thử nghiệm hit, hoặc một cái gì đó để tìm ra những gì nút nó đã qua. – 249076

+0

Tôi nhận được nó làm việc trong pha trộn biểu hiện, nhưng khi tôi sử dụng xaml mới nhất trong phòng thu trực quan nó sẽ không cho phép tôi kéo và thả vào bảng điều khiển ngăn xếp bên trong treeview. Tôi đã thực sự tuyệt vọng bởi vì nếu tôi có thể có được pannel ngăn xếp để kéo và thả mà sẽ đá dự án này vào bánh. – 249076

+0

Tôi đánh dấu bạn là câu trả lời vì nó khiến tôi suy nghĩ, có điều gì đó sai với máy tính của tôi. Điều đó dẫn đến việc tôi phát hiện ra rằng bạn không thể kéo và thả nếu quản trị viên của bạn đang chạy. – 249076

Các vấn đề liên quan