2016-06-11 6 views
1

In meiner WPF app akzeptiere ich drag'n drop Dateien, und nachdem ich überprüft habe, ob sie was ich will bei der Eingabe, ich öffne ein Popup-Fenster für den Benutzer alle eingeben die notwendigen Informationen zu den gelöschten Dateien. Ich verwende nur den Dateinamen des Drop-Ereignisses.Drag'n Drop in WPF Blöcke Explorer

Meine Anwendung funktioniert ohne Probleme. Mir ist jedoch aufgefallen, dass Windows Explorer nicht mehr reagiert, wenn ich die Dateien ablege, und wenn ich den Mauszeiger darüber bewege, bekomme ich einen "ziehenden" Mauszeiger, bis das Popup-Fenster in meiner Anwendung wieder geschlossen wird.

Ich bin auf Sieg 10, wenn es wichtig ist. Wie kann ich das beheben?

XAML:

<Grid AllowDrop="True" Drop="Grid_Drop"> ... </Grid> 

XAML.CS:

private void Grid_Drop(object sender, DragEventArgs e) 
{ 
    if(e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
     var files = (string[])e.Data.GetData(DataFormats.FileDrop); 

     foreach (var file in files) 
     { 
      // ... Check if file is acceptable and if so, open window 
      ShowCreateEditWindow(file);      
     } 
    } 
} 

private void ShowCreateEditWindow(string filePath) 
{ 
    var win2 = new CreateEditWindow(); 
    win2.DataContext = this; 
    win2.CreateEdit.Title = "Adding entry"; 
    win2.fileLabel.Content = filePath; 
    if (win2.ShowDialog() == true) 
    { 
     // If everything is ok, do other stuff 
    } 
    else return; 
} 
+0

ich WinForms und haben diese Zeile hinzugefügt: 'Find() Activate();' (es wäre in Ihrem 'ShowCreateEditWindow' Methode) Es aktiviert im Fall Explorer die haltige Form wartet.. Ich fürchte, ich kenne das Äquivalent in WPF nicht. –

+0

Es gibt .Activate() in Bezug auf Windows in WPF, jedoch hat es in diesem Fall nichts geändert. – Pumar

+0

Ich habe mir erlaubt, Ihre Frage so zu bearbeiten, dass sie verständlicher ist. Ich hatte das gleiche Problem (siehe meine Antwort) – helb

Antwort

1

hatte ich das gleiche Problem und löste es den Ansatz unter:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.timer = new DispatcherTimer(); 
     this.timer.Interval = TimeSpan.FromSeconds(1); 
     this.timer.Tick += new EventHandler(timer_Tick); 
     this.timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     if (this.dropData != null) { 
      ProcessDropData(this.dropData); 
      this.dropData = null; 
     } 
    } 

    private void Window_Drop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) { 
      this.dropData = e.Data.GetData(DataFormats.FileDrop); 
     } 
    } 

    private void ProcessDropData(object data) 
    { 
     string[] paths = (string[])data; 
     // do work here 
    } 

    private DispatcherTimer timer; 
    private object dropData; 
} 

ein DispatcherTimer erlaubt Unter Verwendung der Daten zu einem späteren Zeitpunkt in dem UI-Thread zu verarbeiten.

+0

Danke, es funktioniert :) Dennoch fühle ich wie wir sollten nicht so lange gehen müssen, um Eventhandler nur für das Ansehen zu haben, wenn andere Eventhandler gefeuert haben. – Pumar

+0

@Pumar stimme ich zu. Ein Entwickler würde erwarten, dass diese Art von Problem vom Framework behandelt wird. – helb

0

Verwenden win2.Show() statt win2.ShowDialog schafft Showdialog ein Sperrfenster. Dies bedeutet, dass Sie nicht mehr

if (win2.ShowDialog() == true) 

verwenden können. Sie sollten es wahrscheinlich durch ein Event-System ersetzen.

+0

Aber ich möchte für dieses Fenster mein Hauptfenster blockieren. Ich möchte nur den Dateinamen und dann an Explorer-Informationen senden, dass es seinen Weg gehen kann, ich habe es abgedeckt. – Pumar