Laden...

[gelöst] WPF: Sperre bei unerwünschten Drop (Drag N Drop) funktioniert nicht

Erstellt von tonka vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.224 Views
tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren
[gelöst] WPF: Sperre bei unerwünschten Drop (Drag N Drop) funktioniert nicht

Hy@all,

ich habe ein Problem mit Drag N Drop. Ich habe ein ganz simples Window, wo ich einen Dateipfad aus z.B. dem Explorer "hinein-drope" - das funktioniert auch prima, jedoch möchte ich, dass bei unerwünschte Drops (z.B. es wird ein Bild gedropt, Datei-Extension passt nicht) kein Drop-Cursor-Symbol angezeigt wird. Eigentlich dachte ich, dass das mit ...


 e.Effects = DragDropEffects.None;

das eigentlich erledigt sein sollte, jedoch funktioniert das nicht wirklich.

Hier ist mein Code für die Drag N Drop Aktionen:


        #region Drag N Drop

        private void Window_DragEnter(object sender, DragEventArgs e)
        {
            if (!e.Data.GetDataPresent("FileName") || sender == e.Source)
            {
                e.Effects = DragDropEffects.None; // dieser Abschnitt wird in der runtime erreicht, jedoch zeigt das cursor-symbol an das gedropt werden kann, aber wieso??
            }
        }

        private void Window_Drop(object sender, DragEventArgs e)
        {
            try
            {
                if (e.Data.GetDataPresent("FileName"))
                {
                    string[] filenames = e.Data.GetData("FileName") as string[];
                    if (filenames != null && filenames.Length > 0)
                    {
                        this.OFD.FileName = filenames[0];
                        Load(this.OFD.FileName);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while drop: " + ex.Message, "Error");
            }
        }

        #endregion

Mach ich hier irgendetwas falsch, ist e.Effects für etwas anderes gedacht?

MfG
Tonka

tonka Themenstarter:in
373 Beiträge seit 2006
vor 13 Jahren

Konnte das Problem selbst lösen.

Statt dem DragEnter-Event muss das DragOver-Event benutzt werden. Außerdem muss man e.Handled auf true setzten.


private void Window_DragOver(object sender, DragEventArgs e)
        {
            if (!e.Data.GetDataPresent("FileName") || sender == e.Source)
            {
                e.Effects = DragDropEffects.None;
                e.Handled = true;//WICHTIG!
            }
        }

        private void Window_Drop(object sender, DragEventArgs e)
        {
            try
            {
                if (e.Data.GetDataPresent("FileName"))
                {
                    string[] filenames = e.Data.GetData("FileName") as string[];
                    if (filenames != null && filenames.Length > 0)
                    {
                        this.OFD.FileName = filenames[0];
                        Load(this.OFD.FileName);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error while drop: " + ex.Message, "Error");
            }
        }

MfG
Tonka