2016-08-07 30 views
3

Ich konvertiere eine Anwendung, die ich in WinForms geschrieben habe, in UWP, und soweit ich das beurteilen kann, unterscheidet sich die Drag n Drop-Funktionalität ein wenig. Hier ist mein Code aus meiner WinForms-Anwendung, die ich verwendet habe, um das "gezogene" Objekt zu bekommen, welches ein Control namens FunctionButton ist;Abrufen des tatsächlich fallen gelassenen UIElement-Objekts auf Drop Event in UWP

private void flowLayoutPanel_ActiveGroup_DragDrop(object sender, DragEventArgs e) 
{ 
    Function_Button draggedItem; 

    /* Check if the dragged item is one of the allowed dragged item TYPES. */ 
    draggedItem = (Function_Button)e.Data.GetData(type); 

    if (draggedItem != null) 
    { 
     //DO STUFF 
    } 
} 

ich zur Zeit meine eigene StringDataFormats Einstellung, wenn der Drag Starts für die Informationen, die ich brauche, die ich DataView.GetDataAsync lesen() verwendet, obwohl, wie kann ich einen direkten Zugang zum geschleppt UIElement Objekt in UWP bekommen?

Antwort

1

Ich bin mir nicht sicher, ob dies der beste Weg ist, aber es funktioniert.

Zuerst müssen Sie die DragStarting Ereignis behandeln und die UIElement zu speichern, die innerhalb des DataPackage gezogen wird, die durch die Data Eigenschaft ausgesetzt ist. Der Typ DataPackage scheint sehr stark von Dateien und Dateiformaten abhängig zu sein, aber zum Glück hat er ein Wörterbuch für allgemeine Zwecke, das durch die Eigenschaft Properties verfügbar gemacht wird.

<local:YourElement CanDrag="True" DragStarting="dragStarting"> 

</local:YourElement> 

private void dragStarting(UIElement sender, DragStartingEventArgs args) 
{ 
    args.Data.Properties.Add("anykeyworks", sender); 
} 

Weiter behandeln Sie das Drop-Ereignis wie folgt:

<local:YourOtherElement AllowDrop="True" DragOver="dragOver" Drop="drop"> 

</<local:YourOtherElement> 

private void drop(object sender, DragEventArgs e) 
{ 
    UIElement element = e.DataView.Properties["anykeyworks"] as UIElement; 
} 

private void dragOver(object sender, DragEventArgs e) 
{ 
    e.AcceptedOperation = DataPackageOperation.Copy; 
} 

Wenn Sie die Dragover-Handler nicht implementieren, die Drop-Ereignis wird nicht ausgelöst werden.

+0

Große Problemumgehung, aber leider funktioniert das nicht für mich, wenn ich das im UI-Code getrennt vom DataPackage behalten möchte. Nun, ich denke Hacky Code ist es. Das scheint der Weg in UWP zu sein. – Neme

-1

Wie Sie wissen, unterscheidet sich die Drag & Drop-Funktion in UWP von der in WinForms. In UWP-Apps ist das, was wir ziehen und fallen, nicht das UIElement, sondern das DataPackage. Daher können wir keinen direkten Zugriff auf das gezogene Objekt UIElement erhalten.

Ich bin mir nicht sicher, warum Sie das Objekt UIElement gezogen oder fallen lassen wollen. Wenn Sie beim Ablegen einige Überprüfungen durchführen möchten, können Sie den Inhalt der DataPackageView class überprüfen, die durch die DataView Eigenschaft angezeigt wird.

Weitere Informationen über Drag & Drop-Funktion in UWP finden Sie unter Drag and drop und auch die offizielle Drag and drop sample auf GitHub.

+0

Warum sollte ich das wissen wollen? Vielleicht um zu verhindern, dass ein Gegenstand auf sich selbst gezogen wird? Das scheint möglich zu sein, obwohl das ursprüngliche Objekt während des Ziehens unsichtbar ist. Und anscheinend kann ich das nicht einmal beheben. Großartige Arbeit Microsoft. – Neme

+0

Wie gesagt, wir können keinen direkten Zugriff auf das gezogene UIElement-Objekt erhalten. Sie können jedoch immer den Inhalt der Klasse "DataPackageView" überprüfen, die von der Eigenschaft "DataView" verfügbar gemacht wird. @Frank Rems Antwort hat das gerade getan. Es hat das 'UIElement' mit' e.DataView.Properties ["anykeyworks"] '. –

+0

Ich weiß. Ich habe einen Fehler gefunden, der dazu führt, dass wenn ich etwas aus einer GridView ziehe, ich es auf sich selbst legen kann (sein ursprünglicher Platzhalter, der unsichtbar ist - offensichtlich ein unerwartetes Verhalten). Möglicherweise möchten Sie Ihre Fehler beheben, bevor Sie Ihre Software versenden. Aber ich beschäftige mich schon jetzt mit 2 verschiedenen Bugs. Das ist nichts ungewöhnliches, das nenne ich Dienstag. Wörtlich alles mit Käfern, ich habe noch nie so etwas gesehen. Sie müssen immer Hacks und Workarounds von Workarounds machen. Es ist fast so, als würde niemand UWP benutzen. – Neme