Nach Drag and Drop, MiniFester erstellen? Event auslösen?

  • C#
  • .NET 5–6

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Nach Drag and Drop, MiniFester erstellen? Event auslösen?

    Hallo Community

    Problem: WinForm-Drag and Drop.

    Gibt es ein Event das unmittelbar nachdem "PictureBox_DragDrop" aus dem Scope ist, ausgelöst werden kann?

    Ich habe einen UnterOrdner mit rund 200 Bilder, und sobald ich ein Bild auf die PictureBox gezogen habe und losgelassen habe, soll mir ein kleines MiniFenster (Modal im PictureBox_DragDrop erstellt) geöffnet werden, wo ich das Bild kurz anschauen kann.

    Nur das blöde ist, solange ich mich im PictureBox_DragDrop-Event befinde, habe ich kein Zugriff mit der Maus auf die Bilddateien mehr.

    Ich kann also das Bild im MiniFester, das wiederum mit einem Drag and Drop Event funktionieren soll, nicht mehr ändern.

    Ich habe auch noch kurz die Nicht-Modale Dialoge ausprobiert. Hier habe ich einfach das Problem, dass ich den Weg zurück auf die ursprüngliche Form nicht mehr finde, und ich möchte bevor das Bild in der PictureBox landet noch ein paar Infos (Attripute) aus dem Bild holen, die später brauche.

    Oder wie soll sowas gelöst werden? Danke für die Antworten.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @exc-jdbi Im Framework ist das so, dass da nix upgedatet werden kann, da (wohl) die bereitstellende App bzw. das System die Hand drauf haben.
    Probier mal. mit Async-Await ein Fenster mit ner eigenen Message-Loop zu starten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo ROD

    Die Idee fand ich auch gut. Leider bringt er mir in allen Fällen (Modal - Nicht Modal) die gleiche Fehlermeldung.

    Quellcode

    1. System.InvalidOperationException: "Fehler bei der DragDrop-Registrierung"
    2. Innere Ausnahme
    3. ThreadStateException: Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.


    Ich kann heute Abend ein Code Beispiel reinhängen, dann sieht man es auch gleich, wie ich es gemacht habe.

    Freundliche Grüsse

    exc-jdbi
    So hab kurz ein Projekt erstellt.

    Wenn man das Programm ausprobiert, erkennt man gleich das Problem, dass ich in #1 habe.

    Solange man im PbMain_DragDrop-Event ist, ist der Zugriff auf andere Bilder nach Start von FrmShowImage nicht mehr möglich.

    C#-Quellcode

    1. ​private void PbMain_DragDrop(object sender, DragEventArgs e)
    2. {
    3. if (this.ValideDragDrop)
    4. {
    5. if (this.PbMain.Image is not null) this.PbMain.Image.Dispose();
    6. this.PbMain.Image = null;
    7. using var fsi = new FrmShowImage(this.ImageFileNamePath);
    8. if (DialogResult.OK == fsi.ShowDialog(this))
    9. {
    10. this.ImageFileNamePath = fsi.ImageFileNamePath;
    11. if (this.ImageFileNamePath is not null)
    12. this.PbMain.Image = LoadImage(this.ImageFileNamePath);
    13. }
    14. }
    15. }
    Dateien
    • DADProblemCs.zip

      (8,43 kB, 58 mal heruntergeladen, zuletzt: )

    exc-jdbi schrieb:

    Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden,
    Du musst aus einem Thread heraus das NET6-Äquivalent zu

    VB.NET-Quellcode

    1. Application.Run(new MyForm);
    aufrufen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    exc-jdbi schrieb:

    Meinst du über Process.Start(...)
    Nein.
    Sieh Dir mal die AsyncWaitingForm an: vbarchiv.net/tipps/details.php?id=2327
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Threading;
    4. using System.Windows.Forms;
    5. // http://www.vbarchiv.net/tipps/details.php?id=2327
    6. namespace AsyncWaitingForm
    7. {
    8. /// <summary>
    9. /// Klasse, die eine übergebene Form
    10. /// in einem separaten Thread laufen lässt
    11. /// </summary>
    12. class PleaseWait
    13. : IDisposable
    14. {
    15. /// <summary>
    16. /// Event, das ein externes Schließen anzeigt
    17. /// </summary>
    18. public event EventHandler<EventArgs> Closed = delegate { };
    19. #region Member
    20. /// <summary>
    21. /// Instanz der Waitingform
    22. /// </summary>
    23. private Form WaitSplash;
    24. /// <summary>
    25. /// Startposition der Waitingform
    26. /// </summary>
    27. private Point WaitLocation;
    28. /// <summary>
    29. /// Kennung für mehrere Dispose-Quellen
    30. /// </summary>
    31. private bool IsDisposed;
    32. #endregion Member
    33. #region Konstruktor
    34. /// <summary>
    35. /// Standardkonstruktor der Klasse PleaseWait.
    36. /// Ea werden die Einstellungen zur Anzeige der Waitingform übergeben:
    37. /// </summary>
    38. /// <param name="theWaitingForm">Instanz der zu verwendenden Form</param>
    39. /// <param name="x">die linke Position der Waitingform</param>
    40. /// <param name="y">die obere Position der Waitingform</param>
    41. /// <remarks>
    42. /// Gibt man location nicht explizit als Point an,
    43. /// wird die Waitingform auf dem Screen zentriert gezeigt
    44. /// </remarks>
    45. public PleaseWait(Form theWaitingForm, int x = 0, int y = 0)
    46. {
    47. this.IsDisposed = false;
    48. this.WaitSplash = theWaitingForm;
    49. this.WaitLocation = new Point(x, y);
    50. theWaitingForm.FormClosing += new FormClosingEventHandler(this.theWaitingForm_FormClosing);
    51. Thread thr = new Thread(this.WorkerThread);
    52. thr.IsBackground = true;
    53. thr.SetApartmentState(ApartmentState.STA);
    54. thr.Start();
    55. }
    56. #endregion Konstruktor
    57. private void theWaitingForm_FormClosing(object sender, FormClosingEventArgs e)
    58. {
    59. this.IsDisposed = true;
    60. this.Closed(this, EventArgs.Empty);
    61. }
    62. /// <summary>
    63. /// Beenden des Threads
    64. /// </summary>
    65. public void Dispose()
    66. {
    67. if (!this.IsDisposed)
    68. {
    69. this.WaitSplash.Invoke(new MethodInvoker(this.StopThread));
    70. this.IsDisposed = true;
    71. }
    72. }
    73. /// <summary>
    74. /// Schließen der Waitingform
    75. /// </summary>
    76. private void StopThread()
    77. {
    78. this.WaitSplash.Close();
    79. }
    80. /// <summary>
    81. /// Threadprozedur zur Anzeige der Waitingform
    82. /// </summary>
    83. private void WorkerThread()
    84. {
    85. if (this.WaitLocation == Point.Empty)
    86. {
    87. this.WaitSplash.StartPosition = FormStartPosition.CenterScreen;
    88. }
    89. else
    90. {
    91. this.WaitSplash.Location = this.WaitLocation;
    92. }
    93. this.WaitSplash.TopMost = true;
    94. Application.Run(this.WaitSplash);
    95. }
    96. }
    97. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke ROD.

    Ich werde mir das genauer anschauen müssen, weil so auf die Schnelle habe ich trotzdem immer noch die gleiche Fehlermeldung wie oben.


    EDIT:
    Hat geklappt.

    EDIT V2:
    Ein bisschen besser gelöst, von hier
    Entkoppeln von Drag und Drop-Sources (Explorer) vom eigenen Programm
    Dateien
    • DADProblemV2.zip

      (15,86 kB, 44 mal heruntergeladen, zuletzt: )
    • DADProblemCsVb.zip

      (18,15 kB, 56 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()