2011-09-19 19 views
6

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

+0

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

+0

Pogrubiłem część pytania, która mówi, że problem polega na tym, że zdarzenia nie są uruchamiane. Dzięki. – 249076

+0

Czy ustawiasz zmienną pozycji przyjęcia kropli i przeciągnij na wartość true? –

Odpowiedz

1

Myślę, że problem polega na tym, że nie przeciągasz elementu ponad same TreeViewItems. Jest to konieczne, ponieważ twoje zdarzenia są zarejestrowane tylko dla TreeViewItems. Jeśli chcesz przeciągnąć i upuścić na poziom nadrzędny twojego drzewa, będziesz musiał dodać odpowiednie zdarzenia do swojego drzewa.

Problem, który można rozwiązać za pomocą tego rozwiązania, spowoduje, że zdarzenia TreeView zostaną uruchomione jako pierwsze. Teraz będziesz musiał wiedzieć, który węzeł się zakończy, aby dodać go poprawnie. Istnieją rozwiązania, aby dowiedzieć się, który węzeł się skończył. Sugerowałbym jednak dodanie do twojego drzewa elementu najwyższego poziomu, który zawsze istnieje. Następnie połącz zdarzenia z TreeViewItems takimi, jakimi jesteś. W ten sposób możesz dodać na najwyższym poziomie bez konieczności obsługi zdarzeń TreeView, ponieważ możesz przeciągnąć do tego elementu najwyższego poziomu.

Poniżej jest to, czego użyłem do przetestowania go i widzę punkty przerwania, jeśli przeciągam bezpośrednio nad TreeViewItems. Możesz nie rozpoznać niektórych przestrzeni nazw, ale to dlatego, że odwołuje się do mojego projektu.

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> 

Kod za:

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

Zmontowałem to pytanie, aby skupić się tylko na tym, aby zdarzenia wyświetlały się w widoku drzewa. Odwzorowałem zdarzenia w widoku drzewa i pozbyłem się seterów zdarzeń na drzewach. Musi być coś bardzo prostego, czego mi brakuje. Kiedy przeciągam plik ponad widok drzewa, wszystko, co otrzymuję, to czarne kółko z linią przechodzącą przez niego. Zwolnienie pliku nie powoduje wywołania zdarzenia upuszczania. Gdybym mógł wywołać to zdarzenie, mógłbym zrobić test, lub coś, żeby dowiedzieć się, który węzeł się skończył. – 249076

+0

Mam to działa w mieszance ekspresji, ale kiedy używam najnowszego xaml w visual studio nie pozwala mi przeciągnąć i upuścić na panelu stos wewnątrz widoku drzewa. Byłem naprawdę pełen nadziei, ponieważ gdybym mógł uzyskać panel stosu do przeciągania i upuszczania, który spowodowałby uruchomienie tego projektu. – 249076

+0

Oznaczyłem twoje jako odpowiedź, ponieważ sprawiło, że pomyślałem, że coś jest nie tak z moim komputerem. To doprowadziło mnie do stwierdzenia, że ​​nie możesz przeciągać i upuszczać, jeśli jesteś administratorem. – 249076

Powiązane problemy