Próbuję zrobić niezwykle prosty, lub tak mi się zdawało, program do przeciągania i upuszczania pliku z pulpitu/eksploratora na widok drzewa wpf.Pliki przeciągnij i upuść WPF na TreeView z Eksploratora Windows
Widok drzewa w tym przykładzie jest prosty, dzięki czemu mógłbym wyizolować problem z przeciąganiem i upuszczaniem. Ustawiłem AllowDrop jest równy True w całym miejscu, nadal nie mogę dostać zdarzenia Drop lub DragOver do ognia. Skupiam się na kontroli widoku drzewa, ponieważ chcę mieć możliwość przeciągania plików do różnych węzłów o hierarchicznej strukturze. W tej chwili chciałbym zadbać o możliwość wywołania zdarzeń DragOver lub Drop podczas przeciągania pliku na widok drzewa.
Dostałem zaczął patrząc na przykłady takich jak to: Drag & Drop in Treeview
Moje pytanie jest podobny do tego: Drag drop files from explorer onto Telerik WPF treeview. Jednak używam widoku drzewa wpf, a nie telerik.
Oto kod mam tak daleko
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>
Kod:
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 I pogrubiony tekst literuje mój problem jako wydarzenia nie strzelać.
przeszedłem mój XAML do tego i nadal pojawia się czarny okrąg z linii przez niego podczas przeciągania pliku nad katalogów i jedyne wydarzenie, które wyzwalany jest mouseMove. Przeciąganie i upuszczanie nie działa, gdy użyję myszy do wykonania tych czynności.
<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 Próbowałem pusty katalogów i był w stanie przeciągnąć plik nad nim, a kursor nie był czarny okrąg z linii przez niego.
<TreeView Height="312" Background="#FFCFDBF9" AllowDrop="True"/>
Jednak kiedy DataTemplate jest do niego dodawany, wtedy pojawia się czarne kółko. To musi być jakiś problem z databbingiem?
Edytuj Zaczynam już gdzieś się przenosić.
zmieniłem XAML do tego wydarzenia i zacząć wypalanie:
<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 Odkryłem, że mogę tylko przeciągnąć i upuścić do StackPanel gdybym uruchomić projekt z mieszanki ekspresji. Jeśli uruchomię go z visual studio, pokazuje czarne kółko z linią przez niego przechodzącą. To w ogóle nie ma sensu. W tym problem oddzielnym zacząłem tu kolejne pytanie:Visual Studio 2010 WPF Project ran in debug or relase will not allow drag and drop to any control
to wszystko ze względu na prowadzenie visual studio jako administrator. Najwyraźniej to samo dotyczy notepad.exe, jeśli używasz czegoś jako administrator, którego nie możesz przeciągać i upuszczać. Teraz, aby debugowanie IIS musiałem uruchomić jako administrator, a do przeciągania i upuszczania potrzebuję dowiedzieć się, jak uruchomić w trybie normalnym ...
jak można sobie wyobrazić, by kiedykolwiek uzyskać tej pracy? masz problem wewnątrz TreeView1_Drop? jeśli tak, wyjaśnij, czego potrzebujesz i pokaż, co próbujesz, zacznij sprawdzać właściwości obiektu e DragEventArgs i zobacz, kiedy jest on w trakcie debugowania, co zawiera i jak możesz go użyć, aby uzyskać to, czego potrzebujesz. To samo dotyczy tych innych wydarzeń, które pozostawiłeś puste ... –
Pogrubiłem część pytania, która mówi, że problem polega na tym, że zdarzenia nie są uruchamiane. Dzięki. – 249076
Czy ustawiasz zmienną pozycji przyjęcia kropli i przeciągnij na wartość true? –