webbrowser usar open navigate example control como c# winforms user-controls custom-controls webbrowser-control

c# - usar - Cambiar el tamaño del control de usuario personalizado según los datos en el control webBrowser conectado en él



webbrowser vb (2)

Para cambiar el tamaño de su control de usuario, primero necesita obtener el tamaño que necesita el contenido. Esto se puede lograr con TextRender.MeasureText , así:

public static int GetContentHeight(string content, Control contentHolder, Font contentFont) { Font font = (contentFont != null) ? contentFont : contentHolder.Font; Size sz = new Size(contentHolder.Width, int.MaxValue); int padding = 3; int borders = contentHolder.Height - contentHolder.ClientSize.Height; TextFormatFlags flags = TextFormatFlags.WordBreak; sz = TextRenderer.MeasureText(content, contentHolder.Font, sz, flags); int cHeight = sz.Height + borders + padding; return cHeight; }

En su caso, es un poco más complicado, ya que el texto contiene etiquetas HTML que deben filtrarse para obtener la altura correcta. Creo que esto se puede lograr con RegEx o un simple algo que elimina todo el contenido entre <y> de una cadena. También puede que tenga que crear una línea especial para algunas etiquetas HTML (listas IE)

Tengo un control webBrowser llamado webBrowser1 que se agrega y se acopla como DockStyle.Full en un control de usuario personalizado. El navegador web acepta texto HTML de forma dinámica y lo muestra. webBrowser las barras de desplazamiento del control webBrowser . Mi problema es que cada vez que el contenido es algo largo, el webBrowser oculta desde abajo. Pero el requisito del objetivo de mi proyecto es que webBrowser no muestre ninguna barra de desplazamiento o no debe ocultar parte del contenido. El contenido debe mostrarse completamente tal como está sin desplazarse. Esto significa que el control del usuario en el que está acoplado el webBrowser debe redimensionarse de acuerdo con el contenido de webBrowser . Entonces, ¿alguien puede por favor sugerirme cómo lograr esto? Busqué en Internet y SO, pero no encontré nada.


Puede obtener el tamaño actual de la ventana HTML a través de WebBrowser.Document.Window.Size y cambiar el tamaño del control de contenedor en consecuencia. Dependiendo de cómo su contenido de control WebBrowser recibe actualizaciones dinámicas, probablemente necesite hacer esto después de cada actualización. También podría probar WebBrowser.Document.Body.ScrollRectangle if Document.Window.Size no crece de la manera esperada.

[EDITADO] El siguiente código funciona para mí (IE10):

private void Form1_Load(object sender, EventArgs e) { this.BackColor = System.Drawing.Color.DarkGray; this.webBrowser.ScrollBarsEnabled = false; this.webBrowser.Dock = DockStyle.None; this.webBrowser.Location = new System.Drawing.Point(0, 0); this.webBrowser.Size = new System.Drawing.Size(320, 200); DownloadAsync("http://www.example.com").ContinueWith((task) => { var html = task.Result; MessageBox.Show(String.Format( "WebBrowser.Size: {0}, Document.Window.Size: {1}, Document.Body.ScrollRectangle: {2}/n/n{3}", this.webBrowser.Size, this.webBrowser.Document.Window.Size, this.webBrowser.Document.Body.ScrollRectangle.Size, html)); this.webBrowser.Size = this.webBrowser.Document.Body.ScrollRectangle.Size; }, TaskScheduler.FromCurrentSynchronizationContext()); } async Task<string> DownloadAsync(string url) { TaskCompletionSource<bool> onloadTcs = new TaskCompletionSource<bool>(); WebBrowserDocumentCompletedEventHandler handler = null; handler = delegate { this.webBrowser.DocumentCompleted -= handler; // attach to subscribe to DOM onload event this.webBrowser.Document.Window.AttachEventHandler("onload", delegate { // each navigation has its own TaskCompletionSource if (onloadTcs.Task.IsCompleted) return; // this should not be happening // signal the completion of the page loading onloadTcs.SetResult(true); }); }; // register DocumentCompleted handler this.webBrowser.DocumentCompleted += handler; // Navigate to url this.webBrowser.Navigate(url); // continue upon onload await onloadTcs.Task; // the document has been fully loaded, can access DOM here // return the current HTML snapshot return ((dynamic)this.webBrowser.Document.DomDocument).documentElement.outerHTML.ToString(); }