Полосы прокрутки WCustom не отображаются в элементе управления WebBrowser

StackOverflow https://stackoverflow.com/questions/2018129

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

            //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;
            }

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top