Изменение размера пользовательского элемента управления в соответствии с данными в закрепленном в нем элементе управления webBrowser
У меня есть webBrowser
управление по имени webBrowser1
который добавлен и закреплен как DockStyle.Full
на пользовательском элементе управления. Веб-браузер динамически принимает текст HTML и отображает его. Я отключил полосы прокрутки webBrowser
контроль. Моя проблема заключается в том, что когда содержание webBrowser
скрывает это снизу. Но требование к цели моего проекта заключается в том, чтобы веб-браузер не отображал полосы прокрутки или не скрывал часть содержимого. Содержание должно быть полностью показано без прокрутки. Это означает, что пользовательский элемент управления, на котором webBrowser
состыкован должен изменить свой размер в соответствии с webBrowser
содержание. Итак, кто-нибудь может предложить мне, как этого добиться? Я искал по всему интернету и ТАК, но ничего не нашел.
2 ответа
Вы можете получить текущий размер окна HTML через WebBrowser.Document.Window.Size и соответственно изменить размер элемента управления контейнера. В зависимости от того, как ваш WebBrowser
Контент управления получает динамические обновления, вам, вероятно, придется делать это после каждого обновления. Вы также можете попробовать WebBrowser.Document.Body.ScrollRectangle
если Document.Window.Size
не растет ожидаемым образом.
[ИЗМЕНЕНО] Следующий код работает для меня (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();
}
Чтобы изменить размер вашего usercontrol, вам сначала нужно получить размер, необходимый для контента. Это может быть достигнуто с TextRender.MeasureText, например так:
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;
}
В вашем случае это немного сложнее, так как текст содержит HTML-теги, которые необходимо отфильтровать, чтобы получить правильную высоту. Я верю, что этого можно добиться с помощью RegEx или простого алгоритма, который удаляет весь контент между <и> из строки.. Возможно, вам также придется создать специальный handlig для некоторых HTML-тегов (списки IE)