【问题标题】:WCustom scrollbars not appearing on WebBrowser controlWCustom 滚动条未出现在 WebBrowser 控件上
【发布时间】:2010-01-07 04:00:14
【问题描述】:

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

尽管我已经阅读了很多帖子,即使在 StackOverflow 上,这似乎是一个有效的解决方案,但效果并不好。一个例子是当我在这里尝试使用该解决方案时:

Scrolling problem with a WebBrowser control contained in a Panel control

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

我还尝试根据 ScrollableRectangle 的大小是否大于控件的大小,以编程方式启用和禁用 Web 浏览器的滚动条。这在理论上是可以的,除非它似乎在任何时候更改 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 只是用于允许灵活地格式化文本。我说的只是浏览器控件本身的滚动条。

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

【问题讨论】:

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


    【解决方案1】:

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

    接下来,我更改了滚动条面板的锚点,以便顶部、底部和右侧始终对齐窗体的大小,因此浏览器控件的大小也随着它的所有边缘被锚定。

    然后我添加了一些代码来检查 ScrollRectangle 的大小并将其与浏览器的大小进行比较,如果结果发现它的高度或宽度更大,我就让封面面板不可见,但否则将其留在原处。

    这里是相关代码sn-ps:

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

    希望这对将来的其他人有所帮助,在我找到一种足够好的方法之前,我采用了几种不同的方法。

    我决定提高盛的回答(当我获得足够的声望时),因为首先他是唯一一个回应的人,其次,当我考虑使用某种调用来尝试和在运行时启用滚动条。虽然我发现我的解决方案更简单且同样有效。

    【讨论】:

      【解决方案2】:

      太晚了。 IDocHostUIHandler.GetHostInfo 在创建 webbrowser 时调用,WebBrowser 的实现根据其 ScrollBarsEnabled 属性的值设置 DOCHOSTUIFLAG_SCROLL_NO 或 DOCHOSTUIFLAG_FLAT_SCROLLBAR 标志。

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

      如果您不希望出现特定元素(例如 body、div 或 textarea)的滚动条,您可以将它们的样式设置为 overflow='hidden' 或使用特定于元素(例如 doc)的滚动属性。 Body.SetAttribute("scroll","no").

      【讨论】:

      • 不是页面的任何元素有问题,它只会用于显示格式化文本(已经尝试过richtextbox,它并不理想)。对我来说,问题是 Web 浏览器控件本身右侧下方的滚动条显示为启用了属性/即使/内容完全适合其当前大小。当内容/页面太大而无法容纳在 Web 浏览器控件中时,我基本上只希望浏览器滚动条出现在 Web 浏览器控件上。当您说“为时已晚”时,您是指以编程方式更改浏览器的滚动条属性吗?
      • 是的,IDocHostUIHandler.GetHostInfo 在第一次导航之前被调用。
      • 我已经得出结论,以编程方式设置此属性是行不通的......但是没有其他人可以想到的方法来实现我想要的结果吗?
      • 有没有办法绕过这个限制?修改我的应用程序后,我现在需要做的最后一件事是如果表单无法调整到足够大以适应 ScrollRectangle 的尺寸,则可以选择添加滚动条。谢谢!
      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多