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();
}