Estoy tratando de hacer un programa extremadamente simple, o al menos eso pensé, para arrastrar y soltar un archivo desde el escritorio/explorador en una vista de árbol wpf.WPF arrastrar y soltar archivos en TreeView desde el explorador de Windows
La vista de árbol en este ejemplo es simple para poder aislar el problema de arrastrar y soltar que tengo. Configuré que AllowDrop es igual a True en todos los lugares, todavía no puedo hacer que los eventos Drop o DragOver se disparen. Estoy enfocado en un control treeview porque quiero ser capaz de arrastrar archivos a diferentes nodos con una estructura jerárquica. Ahora me gustaría conformarme con solo poder hacer que los eventos DragOver o Drop se disparen cuando arrastro un archivo a la vista de árbol.
he hecho más que empezar mirando ejemplos como este: Drag & Drop in Treeview
Mi pregunta es similar a la siguiente: Drag drop files from explorer onto Telerik WPF treeview. Sin embargo, estoy usando la vista de árbol de wpf, no la de telerik.
Aquí está el código que tengo hasta ahora
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>
Código:
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; }
}
}
Editar I en negrita el texto que explique mi problema, ya que los eventos no disparando
Cambié mi xaml a esto y sigo teniendo un círculo negro con una línea al arrastrar un archivo sobre la vista de árbol y el único evento que se dispara es el MouseMove. El arrastrar y soltar no se dispara si uso el mouse para realizar esas acciones.
<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>
Editar que intentaron una vista de árbol en blanco y era capaz de arrastrar un archivo sobre él, y el cursor no era el círculo negro con la línea a través de él.
<TreeView Height="312" Background="#FFCFDBF9" AllowDrop="True"/>
Sin embargo, cuando se añade que DataTemplate a ella, que es cuando el círculo negro comienza a aparecer. Esto debe ser algún tipo de problema de enlace de datos?
Editar Estoy empezando a llegar a algún lado ahora.
he cambiado de xaml a esto y los acontecimientos empiezan a disparar:
<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>
edición he descubierto que sólo puedo arrastrarlo a la StackPanel si funciono el proyecto de Expression Blend. Si lo ejecuto desde Visual Studio, muestra el círculo negro con una línea que lo atraviesa. Eso no tiene ningún sentido en absoluto. Para este problema particular que han comenzado otra pregunta aquí:Visual Studio 2010 WPF Project ran in debug or relase will not allow drag and drop to any control
Todo esto es debido a la ejecución de Visual Studio como administrador. Aparentemente lo mismo es cierto para notepad.exe, si ejecuta algo como administrador no puede arrastrar y soltar. Así que ahora para la depuración de IIS tengo que ejecutar como administrador y para arrastrar y soltar, necesito descubrir cómo ejecutar en modo normal ...
¿cómo se imagina que nunca conseguir este trabajo? ¿tienes un problema dentro de TreeView1_Drop? si es así, explique lo que necesita y muestre lo que intentó, comience a verificar las propiedades del objeto DragEventArgs e y vea en el momento de la depuración qué contiene y cómo puede usarlo para obtener lo que necesita. lo mismo para esos otros eventos que dejaste vacío ... –
He puesto en negrita la parte de la pregunta que dice que el problema es que los eventos no se activan. Gracias. – 249076
¿Está configurando la variable aceptar elemento del drop y arrastre a true? –