2010-01-07 3 views
0

Я пытаюсь получить полосы прокрутки, работающие с элементом управления веб-браузером. Однако, поскольку я буду использовать его для отображения сообщения для настраиваемого почтового ящика, я не хочу, чтобы полоса прокрутки появлялась, даже если она не нужна - по-видимому, по умолчанию. Чтобы обойти это, я решил отключить полосы прокрутки на элементе управления и вместо этого использовать полосы прокрутки на другом элементе управления, таком как панель. Таким образом, они появятся только в том случае, если содержимое страницы браузера слишком велико, чтобы соответствовать.WCustom scrollbars не отображается в элементе управления WebBrowser

Это не сработало слишком хорошо, хотя я прочитал довольно много сообщений, даже на StackOverflow, где это кажется правильным решением. Одним из примеров, когда я попытался использовать решение здесь:

Scrolling problem with a WebBrowser control contained in a Panel control

Кажется, что если Scrollbars отключены для веб-браузера, это не позволит использование панели прокрутки либо. Это, по-видимому, имело место при тестировании в режиме разработки. Чтобы преодолеть это, я попробовал добавить коробку с картинками за веб-браузером внутри панели; он работал, когда в режиме дизайна (изменение размера окна изображения и веб-браузера приведет к тому, что панель включит его полосы прокрутки), но не работала во время выполнения (я добавил код, чтобы изменить размер окна изображения на размер элемента управления веб-браузера - который сам по себе изменяется в зависимости от размера прокручиваемого содержимого).

Я также пробовал программно включать и отключать полосы прокрутки веб-браузера на основе, если размер прокручиваемого прямоугольника был больше размера элемента управления. Теоретически это было бы хорошо, если бы не было очищено весь текст внутри элемента управления при изменении свойства ScrollbarsEnabled и, следовательно, он изменился на отсутствие полос прокрутки.

Я делаю это с помощью следующего кода, называется эффективно, когда клавиша нажата в управлении:

if (Output.Document.Body != null) 
{ 
    if (Output.Document.Body.ScrollRectangle.Size.Height > Output.Size.Height 
      || Output.Document.Body.ScrollRectangle.Size.Width > Output.Size.Width) 
     Output.ScrollBarsEnabled = true; 
    else 
     Output.ScrollBarsEnabled = false; 
} 
else 
    Output.ScrollBarsEnabled = false; 

Важно также отметить, что мне также нужно решение для HTML-редактора, который будет используемые в приложении, поэтому в идеале любое решение не будет полагаться на событие загрузки страницы и т. д. ... поскольку они, похоже, не срабатывают, когда веб-браузер имеет режим разработки, установленный на него (что необходимо для его работы в качестве редактора HTML). Однако в этой конкретной ситуации я могу отказаться от включения прокрутки по умолчанию, если нет лучшего решения.

EDIT: Чтобы быть ясным, я не говорю о каких-либо полосах прокрутки в содержимом HTML - это не имеет никакого отношения, поскольку HTML просто используется для гибкого форматирования текста. Я говорю только о панели прокрутки самого браузера.

Любая помощь очень ценится. Благодаря!

ответ

2

Я в конечном итоге нашел решение для этого некоторое время назад, но забыл опубликовать здесь. В основном, что я сделал, сначала включили полосы прокрутки по умолчанию, чтобы они работали, хотя всегда появляются.Затем я создал панель управления и поместил ее в верхнюю часть неактивной полосы прокрутки, которая отображается справа от элемента управления веб-браузера.

Далее я изменил привязки панели прокрутки таким образом, чтобы верхняя, нижняя и правая стороны всегда привязывались к размеру формы, и, следовательно, размер элемента управления браузера, поскольку все его края тоже привязаны ,

Затем я добавил код, который проверяется на ScrollRectangle размера и сравнил ее с браузером, если он оказался больше по высоте или ширине, я тогда сделал панель крышки не видна, но в остальном оставил на месте.

Вот соответствующие фрагменты кода:

  //If still bigger, set scrollbars: 

      if ((Output.Document.Body.ScrollRectangle.Size.Height > Output.Size.Height) || 
       Output.Document.Body.ScrollRectangle.Size.Width > Output.Size.Width) 
      { 
       ScrollPanel.Visible = false; 
       ScrollPanel.Enabled = false; 
      } 

Надеется, что это помогает кто-то в будущем, сделало несколько различных методов, прежде чем я нашел тот, который работал достаточно хорошо.

Я решил поднять ответ Шэн (когда я получу достаточную репутацию), поскольку, во-первых, он был единственным человеком, отвечающим за ответ, а во-вторых, его информация помогла мне, когда я размышлял о том, как использовать какой-то вызов, чтобы попробовать и включить полосы прокрутки во время выполнения. Хотя я нашел решение более простым и эффективным.

+0

Полезная работа вокруг, работала для меня. +1 для вас и Шэн. – fre0n

1

Слишком поздно. IDocHostUIHandler.GetHostInfo вызывается при создании веб-браузера, а реализация WebBrowser устанавливает DOCHOSTUIFLAG_SCROLL_NO или флаг DOCHOSTUIFLAG_FLAT_SCROLLBAR на основе значения свойства ScrollBarsEnabled.

Я предлагаю вам установить ScrollBarsEnabled в false до создания окна управления Webbrowser.

Если вы не хотите, чтобы появлялась полоса прокрутки определенного элемента, например body, div или textarea, вы можете установить их стили overflow = 'hidden' или использовать свойства прокрутки, специфичные для таких элементов, как doc .Body.SetAttribute ("прокрутки", "нет").

+0

Это не какие-то элементы страницы, которая является проблемой, она будет использоваться только для отображения форматированного текста (уже пробовала richtextbox, это не идеально). Проблема для меня заключается в том, что полоса прокрутки справа от элемента управления веб-браузера отображается с включенным свойством/даже если/содержимое идеально вписывается в его текущий размер. В основном я хочу, чтобы панель прокрутки браузеров отображалась в веб-браузере, когда содержимое/страница слишком велика, чтобы входить в элемент управления веб-браузера. Когда вы говорите «слишком поздно», вы имеете в виду программное изменение свойства прокрутки браузера? – Geekman

+0

yes, IDocHostUIHandler.GetHostInfo вызывается перед первой навигацией. –

+0

Я уже как-то уже пришел к выводу, что программная установка этого свойства не сработает ... но разве нет другого способа, который кто-то может придумать для достижения желаемого результата? – Geekman

Смежные вопросы