WebBrowser Control: Detektieren wenn zum Ende gescrollt wurde
In einer meiner Applikationen zeige ich ein HTML-Document in einem Dialog an. Dazu verwendet ich die WebBrowser Control. Der Anwender muss bestätigen, dass er das HTML-Document gelesen (und hoffentlich auch verstanden) hat. Dazu gibt es im Dialog entsprechende Buttons. Diese Buttons bleiben aber so lange inaktiv, bis der Anwender zum Endes des Dokumentes gescrollt hat (Abbildung 1).

Tönt irgendwie ganz einfach. War es aber nicht. Ich brauchte einige Zeit um herauszufinden, wie das geht. Vor allem auch, weil mich ChatGPT für einmal auf eine völlig falsche Fährte mit JavaScript uns so Zeugs geführt hat. Vielleicht hat ja jemand da draussen das gleiche Problem, weshalb ich hier meine Lösung präsentiere:
using System; using System.Windows.Forms; namespace TomTomTools.MeasurementStudio.Gui.Tests { public partial class TestMessageBox : Form { private static TestMessageBox box; public TestMessageBox(string htmlFilePath) { InitializeComponent(); webBrowser1.Navigate(htmlFilePath); SetButtonStatesFromScrollPosition(); SubscribeToScrollEvents(); } public static DialogResult ShowHtml(string htmlFilePath, string caption) { box = new TestMessageBox(htmlFilePath); box.Text = caption; return box.ShowDialog(); } private void SubscribeToScrollEvents() { System.Diagnostics.Debug.Assert(webBrowser1.Document != null, "Has not document to scroll."); webBrowser1.Document.Window.Scroll += HtmlViewScroll; } private void HtmlViewScroll(object sender, HtmlElementEventArgs e) { SetButtonStatesFromScrollPosition(); } private void SetButtonStatesFromScrollPosition() { btnYes.Enabled = IsHtmlScrolledToBottom(); btnNo.Enabled = IsHtmlScrolledToBottom(); } private bool IsHtmlScrolledToBottom() { var bodies = webBrowser1.Document.GetElementsByTagName("body"); if (bodies.Count == 0) return false; var body = webBrowser1.Document.GetElementsByTagName("body")[0]; if (body == null) return false; var window = webBrowser1.Document.Window; var scrollRect = body.ScrollRectangle; var bottomVisiblePos = scrollRect.Top + window.Size.Height; var heightOfDisplayedDocument = scrollRect.Height; return bottomVisiblePos >= heightOfDisplayedDocument; } } } |