Wpf: Glisser-Déposer D'Une Zone De Texte
J'ai googlé ce problème, et les gens ont répondu à des questions similaires, mais pour une raison que je ne peux pas trouver quelque chose à travailler. Je dois avoir raté quelque chose ici... En tout cas, lorsque j'exécute le code suivant, la TextBox_DragEnter gestionnaire n'est jamais appelée. Cependant, si je change l'élément de zone de texte dans le code xaml pour un élément TextBlock, il est appelé. Est-il possible d'obtenir le même comportement à partir d'un élément de zone de texte? Le code suivant isole le problème...
MainWindow.xaml:
<Window x:Class="Wpf1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Name="myGrid">
<TextBox AllowDrop="True" PreviewDragEnter="TextBox_DragEnter" PreviewDrop="TextBox_Drop" />
</Grid>
</Window>
MainWindow.xaml.cs:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Collections.ObjectModel;
namespace Wpf1
{
///<summary>
///Interaction logic for MainWindow.xaml
///</summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void TextBox_DragEnter(object sender, DragEventArgs e)
{
e.Effects = DragDropEffects.Copy;
}
private void TextBox_Drop(object sender, DragEventArgs e)
{
}
}
}
Merci beaucoup d'avance!
Andrew
EDIT:
Juste pour clarifier, je tiens à permettre la chute d'un objet personnalisé dans une zone de texte. Dans le menu gestionnaire de la zone de texte, je voudrais ensuite définir le texte de la zone de texte à une propriété de l'objet, puis définissez la propriété IsReadOnly de la zone de texte à faux. Je suis juste un peu de mal à l'activation de glisser-déposer pour la zone de texte...
Vous devez vous connecter pour publier un commentaire.
Si vous ajoutez un gestionnaire pour PreviewDragOver, puis ensemble e.Manipulés = true, il doit travailler.
Fonctionne pour moi en tout cas.
TextBox
semble avoir déjà une certaine gestion par défaut pour DragAndDrop. Si votre objet de données est une Chaîne de caractères, il fonctionne tout simplement. Les autres types ne sont pas traitées et vous obtenez le Interdit effet de la souris et de votre Chute de gestionnaire n'est jamais appelée.Il semble que vous pouvez permettre à votre propre manipulation avec
e.Handled
àtrue
dans unPreviewDragOver
gestionnaire d'événement.Je ne pouvais pas trouver tous les détails à ce sujet sur le site MSDN, mais
trouvé http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF très utile.
Vous pouvez également gérer PreviewDragEnter de la même façon que PreviewDragOver ou il sera par défaut à l'Interdit de la Souris sur le premier pixel.
Dans le gestionnaire assurez-vous que le DragEventArgs.Les données sont le type que vous souhaitez déposer. Si c'est DragEventsArgs.Effets de DragDropEffects.Déplacer ou quelque chose d'autre dans AllowedEffects. Si ce n'est pas le type que vous souhaitez déposer, mettre à DragDropEffects.Une option qui désactive l'abandon.
XAML pour MVVM Light:
Gestionnaire dans le ViewModel:
Mieux créer votre propre zone de texte de la classe qui implémente
Textbox
. Puis remplacer le OnDrag-Événements et de définire.handled
àfalse
ou faire ce que vous voulez.C'est un peu sale à utiliser les événements qui ne sont pas faits pour l'original voulais comportement. Aperçu pour vérifier certaines choses et avoir une bonne option Annuler avant de commettre le réel DragDrop-Événements.