Wpf: Glisser-Déposer Dans Une Boîte De Texte

j'ai googlé ce problème, et les gens ont répondu à des questions similaires, mais pour une raison quelconque, Je ne peux rien obtenir à travailler. Je dois avoir raté quelque chose ici... En tout cas, quand j'exécute le code suivant, le gestionnaire TextBox_DragEnter n'est jamais appelé. Cependant, si je change L'élément TextBox dans le xaml en un élément Textlock, il est appelé. Y a-t-il un moyen d'obtenir le même comportement d'un élément TextBox? 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!

André

EDIT:

juste pour clarifier, j'aimerais permettre de laisser tomber un objet personnalisé dans une zone de texte. Dans le Drop handler pour la textbox, je voudrais ensuite mettre le texte de la textbox à une propriété de l'objet, puis mettre la propriété IsReadOnly de la TextBox à false. Je suis juste avoir de la difficulté à activer le drag and drop pour la TextBox...

24
demandé sur Andrew 2010-11-26 03:55:28

4 réponses

si vous ajoutez un handler pour PreviewDragOver, alors définissez E. Handled = true it should work.

travaille pour moi dans tous les cas.

43
répondu Liz 2010-11-26 01:57:09

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 manipulés et vous obtenez le Interdit effet de souris et votre Drop handler n'est jamais appelé.

il semble que vous pouvez activer votre propre manipulation avec e.Handledtrue dans un PreviewDragOver gestionnaire d'événement.

je ne pouvais pas trouver tous les détails à ce sujet sur le site MSDN, mais trouver http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF très utile.

12
répondu trapicki 2014-04-18 08:42:16

vous pouvez également vouloir traiter PreviewDragEnter de la même manière que PreviewDragOver ou il sera par défaut à la souris interdite sur le premier pixel.

dans le handler assurez-vous que le DragEventArgs.Data est le type que vous voulez laisser tomber. Si C'est le cas, mettez DragEventsArgs.Effets de Dragdropeffets.Déplacer ou quelque chose d'autre dans les effets autorisés. Si ce n'est pas le type que vous voulez laisser tomber, définissez à DragDropEffects.Une option qui désactive l'abandon.

XAML pour MVVM Lumière:

<i:Interaction.Triggers>
        <i:EventTrigger EventName="Drop">
            <cmd:EventToCommand Command="{Binding DragDropCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
        <i:EventTrigger EventName="PreviewDragOver">
            <cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
        <i:EventTrigger EventName="PreviewDragEnter">
            <cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

Gestionnaire dans le ViewModel:

        private void ExecutePreviewDragEnterCommand(DragEventArgs drgevent)
        {
            drgevent.Handled = true;


            // Check that the data being dragged is a file
            if (drgevent.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // Get an array with the filenames of the files being dragged
                string[] files = (string[])drgevent.Data.GetData(DataFormats.FileDrop);

                if ((String.Compare(System.IO.Path.GetExtension(files[0]), ".xls", true) == 0)
                    && files.Length == 1)
                    drgevent.Effects = DragDropEffects.Move;
                else
                    drgevent.Effects = DragDropEffects.None;

            }
            else
                drgevent.Effects = DragDropEffects.None;
        }
4
répondu haps 2014-09-17 15:24:18

mieux créer votre propre classe Textbox qui implémente Textbox. Ensuite, outrepassez les OnDrag-Events et définissez e.handledfalse ou faire ce que vous voulez.

c'est un peu sale d'utiliser des événements qui ne sont pas faits pour le comportement recherché original. Preview est de vérifier quelques trucs et avoir une bonne option défaire avant de commettre le vrai DragDrop-événements.

0
répondu Tost 2018-06-07 09:51:12