Update Picturebox während des scrollens einer ListBox

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    Update Picturebox während des scrollens einer ListBox

    Hallo!

    Ich hab eine WinForm mit ua. einer ListBox und zwei PictureBoxen..
    ..des weiteren einen Timer der in kurzen Intervallen einen Graphen in einer PictureBox darstellt.

    Aber wenn ich in der ListBox scrolle friert die Picturebox für die Zeit des scrollens ein..
    ..habs schon mitm BackgroundWorker versucht, aber gleiches Ergebnis!

    Wie kann ich denn die betreffenden Controls refreshen lassen während ich scrolle?!?
    Auch wenn ich's nicht probiert hat, back ich mal n Spekulatius: Das geht nicht. Weil es beides GUI-verändernde Aufgaben sind., die gleichzeitig ablaufen sollen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Tja, Versuch macht kluch. Aber nein, funktioniert nicht, ich hab's probiert. Hätte mich auch gewundert, wenn jedes Form seinen eigenen GUI-Thread bekommt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich glaube, dass einer von uns beiden das Problem falsch verstanden hat, denn in meinem Szenario funktioniert Dein Ansatz nicht, @exc-jdbi.
    Das ist mein Code, um das Problem nachzustellen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private x As Integer = 0
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. For i = 0 To 100
    5. ListBox1.Items.Add(i.ToString)
    6. Next
    7. End Sub
    8. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    9. PictureBox1.Invalidate()
    10. End Sub
    11. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    12. e.Graphics.DrawLine(Drawing.Pens.Red, 0, x, 100, 100)
    13. x = (x + 10) Mod 100
    14. End Sub
    15. End Class

    Bei der ListBox z.B. 10 Zeilen anzeigen lassen, Eingabefokus auf die ListBox und dann mit dem Mausrad schnell scrollen. Dann sieht man, dass die PicBox in ihrer Zeichenarbeit unterbrochen wird.
    Aber vielleicht habe ich es ja auch falsch verstanden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Guten Morgen

    @VaporiZed von dieser Seite habe ich das nicht angeschaut. Ich bin davon ausgegangen, dass das Scrollen mit der Scrollliste gemacht wird.

    Ich habs jetzt nicht ausprobiert, aber wenn man in die Parent-Form so was einbaut, entsteht der gleich Effekt wie mit dem Timer?

    VB.NET-Quellcode

    1. ​Public Event MouseWheel As ListBoxExMouseWheelDelegate
    2. Public Delegate Sub ListBoxExMouseWheelDelegate(Sender As Object, e As ListBoxExScrollArgs) 'MouseEventArgs
    3. Private Sub ListBoxEx1_MouseWheel(sender As Object, e As MouseEventArgs) Handles ListBoxEx1.MouseWheel
    4. Me.PictureBox1.Update()
    5. End Sub


    Freundliche Grüsse

    exc-jdbi
    Der Timer muss aber laut morrison drin sein, denn der zeichnet den PicBoxGraphen neu. Ob sich ggf. auch das komplette Szenario ohne Timer erstellen lässt, weiß nur er. Allerdings mit Timer klappt auch das Update/Invalidate im ListBox-MouseWheel-EventHandler nicht. Mit Refresh wird es etwas zuverlässiger, aber nicht perfekt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Morrison Da musst Du die andere Form in einem anderen Thread in einer eigenen MessageLoop laufen lassen.
    Ich poste mal das C#-Beispiel, das ist übersichtlicher und ohne VisualBasic:
    SplashScreen.cs.zip
    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!
    Iwie nix zu machen..

    Hab versucht im MouseWheel-Event was zu machen..das Updaten hakt immer dann solange wie sich die Liste der Listbox bewegt..
    nen Paint-Event gibt's da nicht..
    wo kann man denn hooken während die Listbox gezeichnet wird?

    Das mit zwei Forms will ich garnicht erst versuchen..

    ..ach, und DoubleBuffered habbich auch probiert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Morrison“ ()

    Also wenn du das Smooth-Scrolling weg nimmst scheint es nicht zu blockieren:

    How can I disable "Smooth" scrolling with wheel action in Listbox of VB.net?

    VB.NET-Quellcode

    1. Private Sub ListBox1_MouseWheel(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseWheel
    2. ListBox1.Visible = False
    3. ListBox1.Visible = True
    4. End Sub

    Ist nur dann etwas unschön.