禁用WPF WebBrowser滚动条

13

我试图隐藏网页浏览器的滚动条,但它仍然可见。

XAML:


<WebBrowser Name="wb" Width="700" Height="600" 
                        OverridesDefaultStyle="False"
                        ScrollViewer.CanContentScroll="False"
                        ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
                        ScrollViewer.VerticalScrollBarVisibility="Hidden" />

谢谢。

10个回答

23

这对我有效:

<WebBrowser LoadCompleted="wb_LoadCompleted"></WebBrowser>           

void wb_LoadCompleted(object sender, NavigationEventArgs e)
    {
        string script = "document.body.style.overflow ='hidden'";
        WebBrowser wb = (WebBrowser)sender;
        wb.InvokeScript("execScript", new Object[] { script, "JavaScript" });
    }

这样你就不需要使用mshtml了


4
@befstrat的解决方案无法正常工作,我不得不使用以下脚本进行更改: string script = "document.documentElement.style.overflow ='hidden'" - Ratman

8

不是最理想的方法,但它可行:

在项目引用中添加Microsoft.mshtml。然后将您的xaml更改为:

<WebBrowser Name="wb" Width="700" Height="600" 
            OverridesDefaultStyle="False"
            ScrollViewer.CanContentScroll="False"
            ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
            ScrollViewer.VerticalScrollBarVisibility="Hidden"
            LoadCompleted="wb_LoadCompleted"></WebBrowser>

并且在你的代码后面:

private void wb_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    mshtml.IHTMLDocument2 dom = (mshtml.IHTMLDocument2)wb.Document;
    dom.body.style.overflow = "hidden";
}

2
滚动条仍然存在。 - Alvin
这是一个禁用了垂直滚动条的内容。 - Alvin
@Sisyphe:请问我需要添加哪个引用才能访问mshtml?谢谢。 - Nerdynosaur
1
这个方案对我来说运作良好,您想展示的页面是什么?可能会有滚动条吗? - Markus
没问题,对我来说可以运行。不需要添加任何东西。 - B.K.
显示剩余3条评论

7
scroll="no" 添加到 html 的 body 标签中对我有用,而其他建议则没有用。

4

在你的HTML代码中...

 html{overflow:hidden;}

它应该解决这个问题,或者您可以使用元标记来指定IE呈现模式。

<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 

设置HTML样式似乎是这里最干净的答案...但WPF WebBrowser让我头疼。 - Martin Clemens Bloch

1
将Microsoft.mshtml添加到您的项目引用中。当使用mshtml时,您不需要更改XAML中的任何滚动属性,因为它们并不控制webbrowser。在LoadCompleted函数中执行以下操作:
private void webBrowserChat_LoadCompleted(object sender, NavigationEventArgs e)
{
    mshtml.IHTMLDocument2 documentText = (IHTMLDocument2)webBrowserChat.Document; 
    //this will access the document properties 
    documentText.body.parentElement.style.overflow = "hidden"; 
   // This will hide the scrollbar (Set to "auto" if you want to see when it passes the surfacelimit)
}

1
我使用了这个简单的一行代码来直接定义文档的主体部分:
wb.Document.Body.scroll = "no"

1

抱歉有点晚了,但我终于能够禁用滚动条了。@Devdude的提示是关键。

主要的方法是设置overflow = hidden,但在WPF中如何实现呢?我使用了DependencyObject,这样我就可以随时绑定:启用和禁用。

首先,您需要添加对mshtml的引用。在您的项目中,添加引用Microsoft.mshtml。然后在您的.cs文件中添加:

using mshtml;

依赖对象(DependencyObject)。
public class WebBrowserUtility : DependencyObject
{
    public static readonly DependencyProperty HideScrollBarProperty = DependencyProperty.RegisterAttached(
        "HideScrollBar",
        typeof(string),
        typeof(WebBrowserUtility),
        new UIPropertyMetadata(null, HideScrollBarPropertyChanged));

    public static string GetHideScrollBar(DependencyObject obj)
    {
        return (string)obj.GetValue(HideScrollBarProperty);
    }
    public static void SetHideScrollBar(DependencyObject obj, string value)
    {
        obj.SetValue(HideScrollBarProperty, value);
    }
    public static void HideScrollBarPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        WebBrowser browser = obj as WebBrowser;
        string str = args.NewValue as string;
        bool isHidden;
        if (str != null && bool.TryParse(str, out isHidden))
        {
            browser.HideScrollBar(isHidden);
        }
    }
}

WebBrowser扩展是实际执行禁用溢出的工作,但仅在WebBrowser文档加载完成后才会发生。
public static class WebBrowserExtension
{
    public static void HideScrollBar(this WebBrowser browser, bool isHidden)
    {
        if (browser != null)
        {
            IHTMLDocument2 document = browser.Document as IHTMLDocument2;
            if (document == null)
            {
                // If too early
                browser.LoadCompleted += (o, e) => HideScrollBar(browser, isHidden);
                return;
            }

            //string bodyOverflow = string.Format("document.body.style.overflow='{0}';", isHidden ? "hidden" : "auto");
            //document.parentWindow.execScript(bodyOverflow); // This does not work for me...

            string elementOverflow = string.Format("document.documentElement.style.overflow='{0}';", isHidden ? "hidden" : "auto");
            document.parentWindow.execScript(elementOverflow);
        }
    }
}

在XAML中使用
<WebBrowser ns:WebBrowserUtility.HideScrollBar="True"/>

注意:确保将 WebBrowser 拉伸以查看整个内容。无论如何,这次将隐藏 scrollbar

0

hidden 值分配给 body 标签的 overflow 属性可以解决此问题。

如果您有一个针对 body 标签的 CSS 规则集,请添加以下行:

overflow: hidden

否则,请将以下行添加到您的具体 <body> 标签声明中:
style="overflow:hidden"

0

这不是你们所有人遇到的完全相同的问题,但我的搜索把我带到了这里,所以我希望这能帮助到某些人。我试图使用WPF WebBrowser组件嵌入PDF文档。结果发现是PDF查看器(从浏览器调用)创建了滚动条!

为了解决这个问题,在对PD文件的调用中添加参数。在我的XML中:

Source="http://address/file.pdf#toolbar=0&navpanes=0&scrollbar=0"

在代码后台中,它的格式如下:http://address/file.pdf#toolbar=0&navpanes=0&scrollbar=0

(感谢leeand00提供的解决方案,他回答了this的问题。)


0

我将WebBrowser控件的宽度增加了16像素,这是滚动条的宽度。

只有当您的Web浏览器控件接触到应用程序的最右侧时,此方法才有效。Web浏览器控件不允许其他XAML元素位于其上方,但您可以使其溢出应用程序的边缘。

我在窗口的Loaded事件处理程序中完成了这个操作:

private void AppLoaded(object sender, RoutedEventArgs routedEventArgs)
{
    WebBrowserView.Width = WebBrowserView.ActualWidth + 16;
}

我发现将JavaScript注入页面中似乎会破坏一些页面,滚动条只有在页面加载完成后才会消失。

只有在用户不调整窗口大小时才能正常工作。如果大小发生变化,您必须不断更新它。 - B.K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接