He buscado en google este problema, y la gente ha respondido a preguntas similares, pero por alguna razón que no puedo conseguir algo de trabajo. Debo haber perdido algo aquí… En todo caso, cuando yo ejecute el código siguiente, el TextBox_DragEnter controlador no se llama nunca. Sin embargo, si puedo cambiar el elemento de cuadro de texto en el código xaml para un elemento TextBlock, se llama. Hay alguna manera de conseguir el mismo comportamiento de un elemento de cuadro de texto? El siguiente código aísla completamente el problema…

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)
        {

        }
    }
}

Muchas gracias de antemano!

Andrew

EDICIÓN:

Solo para aclarar, me gustaría para permitir colocar un objeto personalizado en un cuadro de texto. En el cuadro de controlador para el cuadro de texto, entonces me gustaría que el texto del textbox a una propiedad en el objeto y, a continuación, establezca la propiedad IsReadOnly del TextBox a false. Estoy teniendo algunos problemas para habilitar arrastrar y soltar para el cuadro de texto…

InformationsquelleAutor Andrew | 2010-11-26

4 Comentarios

  1. 53

    Si agrega un controlador para PreviewDragOver, a continuación, establezca el correo.Handled = true se debe trabajar.

    Que funciona para mí, en cualquier caso.

    • Gracias Liz! Que funciona muy bien!
    • +1 Gracias, trabajó también para mí… Aunque, a continuación, restablece los Efectos de lo previsto en el evento DragEnter. Necesitamos encontrar alguna sofisticada manera de manejar esto.
  2. 14

    TextBox parece tener ya un cierto control predeterminado para DragAndDrop. Si el objeto de datos es una Cadena, que simplemente funciona. Otros tipos no se controlan y se obtiene el Prohibido ratón efecto y su Caída controlador no se llama nunca.

    Parece que puede permitir que su propio manejo con e.Handled a true en un PreviewDragOver controlador de eventos.

    Que no he podido encontrar ningún dato sobre el que en MSDN, pero
    encuentra http://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF muy útil.

  3. 6

    Usted también puede querer manejar PreviewDragEnter de la misma manera como PreviewDragOver o se utilizará de forma predeterminada, el Prohibido Ratón sobre el primer píxel.

    En el controlador asegúrese de que el DragEventArgs.De datos es el tipo que desea colocar. Si es así, establece DragEventsArgs.Efectos a DragDropEffects.Mover o algo más en AllowedEffects. Si no es el tipo que desea colocar, establecer a DragDropEffects.Ninguno que deshabilita la caída.

    XAML para MVVM Light:

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

    Controlador en 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;
            }
    • funciona, y puedo hacer que el cuadro de texto del texto convertido en la ruta de acceso del archivo en el cuadro de texto del texto = archivos[0]
  4. 0

    Mejor crear su propio cuadro de texto de la clase que implementa Textbox. A continuación, reemplazar el OnDrag-Eventos y establecer e.handled a false o hacer lo que quieras.

    Es un poco sucio a usar los eventos que no están hechas para el original de comportamiento deseado. La vista previa es comprobar algunas cosas y tener una buena opción de Deshacer antes de cometer el real DragDrop-Eventos.

Dejar respuesta

Please enter your comment!
Please enter your name here