Полосы прокрутки WCustom не отображаются в элементе управления WebBrowser - PullRequest
0 голосов
/ 07 января 2010

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

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

Проблема прокрутки с элементом управления WebBrowser, содержащимся в элементе управления Panel

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

Я также попытался программно включить и отключить полосы прокрутки веб-браузера, основываясь на том, был ли размер ScrollableRectangle больше размера элемента управления. Это теоретически было бы хорошо, за исключением того, что, кажется, очищает весь текст в элементе управления каждый раз, когда свойство 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). Однако в этой конкретной ситуации я могу прибегнуть к включению полос прокрутки по умолчанию, если нет лучшего решения.

РЕДАКТИРОВАТЬ: Для ясности, я не говорю о каких-либо полос прокрутки в контенте HTML - это не имеет значения, поскольку HTML просто используется для обеспечения гибкого форматирования текста. Я говорю только о полосе прокрутки самого элемента управления браузера.

Любая помощь высоко ценится. Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

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

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

Затем я добавил код, который проверил размер 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;
            }

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

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

1 голос
/ 08 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...