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 ...
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 ... –
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
Bạn có đang đặt biến mục chấp nhận của thả và kéo sang đúng không? –