自定义滚动条未出现在Web浏览器控件上

时间:2010-01-07 04:00:15

标签: c# .net winforms webbrowser-control browser-scrollbars

我正在尝试让滚动条与Web浏览器控件一起使用。但是,由于我将使用它来显示自定义消息框的消息,我不希望滚动条出现,即使它不需要 - 因为它似乎默认情况下会这样做。为了避免这种情况,我决定禁用控件上的滚动条,而是使用另一个控件上的滚动条,如Panel。这样,只有当浏览器页面的内容太大而无法容纳时,它们才会出现。

虽然我已阅读了不少帖子,即使在StackOverflow上,这似乎也是一个有效的解决方案。一个例子是我在这里尝试使用解决方案时:

Scrolling problem with a WebBrowser control contained in a Panel control

似乎如果Web浏览器禁用了Scrollbars,它也不会让面板使用滚动条。在设计模式下进行测试时似乎就是这种情况。为了解决这个问题,我尝试在面板内的Web浏览器后面添加一个图片框;它在设计模式下工作(调整图片框和Web浏览器的大小会导致面板启用其滚动条),但在运行时没有工作(我添加了代码以使图片框更改为Web浏览器控件的大小 - 它本身的大小总是调整大小以适应可滚动内容的大小。)

我还尝试以编程方式启用和禁用Web浏览器的滚动条,具体取决于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编辑器的解决方案,它将在应用程序中使用,所以理想情况下,任何解决方案都不会依赖于页面加载事件等......因为这些似乎不会触发Web浏览器将设计模式设置为on(用作HTML编辑器所需的模式)。但是,在这种特殊情况下,如果没有更好的解决方案,我可以依靠启用默认滚动条。

编辑:要明确,我不是在讨论HTML内容中的任何滚动条 - 这一点无关紧要,因为HTML只是用于允许灵活格式化文本。我只是谈论浏览器控件本身的滚动条。

任何帮助非常感谢。谢谢!

2 个答案:

答案 0 :(得分:2)

我现在不久前找到了一个解决方案,但忘了在这里发帖。基本上我所做的是默认情况下首先启用滚动条,以便它们可以工作,尽管总是出现。然后我创建了一个面板控件,并将其调整到Web浏览器控件右侧显示的非活动滚动条的顶部。

接下来,我更改了滚动条面板的锚点,以便顶部,底部和右侧始终捕捉到表单的大小,因此浏览器控件的大小也会固定,因为它的所有边缘也都会被锚定。

然后我添加了一些检查 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 :(得分:1)

现在为时已晚。创建Web浏览器时会调用IDocHostUIHandler.GetHostInfo,WebBrowser的实现会根据其ScrollBarsEnabled属性的值设置DOCHOSTUIFLAG_SCROLL_NO或DOCHOSTUIFLAG_FLAT_SCROLLBAR标志。

我建议您在创建Webbrowser控件的窗口之前将ScrollBarsEnabled设置为false。

如果您不希望出现特定元素(如body,div或textarea)的滚动条,则可以将其样式设置为overflow ='hidden'或使用特定于doc等元素的滚动属性。 Body.SetAttribute( “滚动”, “否”)。