【问题标题】:Resize Dialog/WebBrowser to webpage width将 Dialog/WebBrowser 调整为网页宽度
【发布时间】:2014-02-05 20:43:39
【问题描述】:

有没有办法使用基于初始网页加载的网页浏览器控件自动调整窗口大小?

.Height 或 .Width 属性没有任何运气,也尝试了 ActualWidth、ActualHeight 的属性。

这是 XAML。

<dialog:Window x:Class="MyApplication.Widgets.Controls.DiagnosticsWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:dialog="clr-namespace:UI.Common.Dialog;assembly=UI.Common"
            xmlns:controls="clr-namespace:UI.Common.Controls;assembly=UI.Common"
            mc:Ignorable="d" 
            Height="500" Width="600" 
            ShowInTaskbar="False" 
            ResizeMode="NoResize"
            Title="{Binding Path=WindowTitle}"
            WindowStartupLocation="CenterOwner">

    <controls:DialogFrame Width="{Binding Path=WindowWidth}" Height="Auto" CloseCommand="Close">
        <WebBrowser x:Name="DiagnosticsWebBrowser" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </controls:DialogFrame>
</dialog:Window>

我尝试做以下没有任何运气, WPF: How to auto-size WebBrowser inside a Popup?

这是我目前得到的...(都没有正确调整大小)。

【问题讨论】:

  • 完全删除 Width 属性会发生什么?
  • 来自 DialogFrame?还是对话框窗口?
  • 一个类似的问题 answered 用于 WinForms WebBrowser

标签: c# wpf xaml webbrowser-control


【解决方案1】:

对于 WPF WebBrowser,我设置了一个恒定的宽度,然后计算高度,所以:

  1. SizeToContent 设置为"Height" 并将窗口的宽度设置为恒定。
  2. 添加对Microsoft.mshtml的引用
  3. 在 WebBrowser 上使用以下代码 LoadCompleted:
    
    var webBrowser = (WebBrowser)sender;
    var doc = (IHTMLDocument2)webBrowser.Document;
    var height = ((IHTMLElement2)doc.body).scrollHeight;
    webBrowser.Height = Math.Min(height, (int)SystemParameters.WorkArea.Height - 100);
    

【讨论】:

    【解决方案2】:

    WPF Web 浏览器控件不会公开调整窗口大小所需的加载页面大小。最简单的解决方案是使用 WinForms WebBrowser(由 Noseratio 建议),您可以使用 WindowsFormsHost 元素将其嵌入到 WPF 窗口中:

    <Window 
        x:Class="MyApplication.Widgets.Controls.DiagnosticsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        mc:Ignorable="d" 
        SizeToContent="WidthAndHeight"
        WindowStartupLocation="Manual">
    
        <WindowsFormsHost>
            <forms:WebBrowser 
                x:Name="DiagnosticsWebBrowser" 
                Width="420"
                Height="240"
                ScrollBarsEnabled="False" 
                DocumentCompleted="DiagnosticsWebBrowser_DocumentCompleted" />
        </WindowsFormsHost>
    </Window>
    

    不要忘记将 System.Windows.Forms 程序集添加到您的项目中。

    然后,在您的代码隐藏中:

    // Called after the document has been rendered
    private void DiagnosticsWebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
        {
            // Resize the window
            int width = WebBrowser.Document.Body.ScrollRectangle.Size.Width;
            width = Math.Min(width, (int)SystemParameters.WorkArea.Width - 100);
    
            int height = WebBrowser.Document.Body.ScrollRectangle.Size.Height;
            height = Math.Min(height, (int)SystemParameters.WorkArea.Height - 100);
    
            DiagnosticsWebBrowser.Size = new System.Drawing.Size(width, height);
            UpdateLayout();
    
            // Re-center the window
            WindowStartupLocation = WindowStartupLocation.Manual;
            Left = (SystemParameters.WorkArea.Width - ActualWidth) / 2 + SystemParameters.WorkArea.Left;
            Top = (SystemParameters.WorkArea.Height - ActualHeight) / 2 + SystemParameters.WorkArea.Top;
        }
    

    请务必注意,网页没有“固有”页面大小 - 即,它们可以使用网络浏览器提供的任何空间。作为一种解决方法,我们使用我们首选的 MINIMUM 大小(在上面的示例中为 420x240)创建一个 WebBrowser,然后在呈现文档后,我们通过查看其 ScrollRectangle 来检查文档是否最终大于该大小。

    一些注意事项:我将窗口的大小限制为 SystemParamters.WorkArea,这样如果我们有一个非常大的文档,我们最终不会得到一个比桌面更大的窗口。我进一步将宽度和高度偏移了 100px,以确保我们的窗口标题、滚动条等也有空间。

    还要注意 WindowStartupLocation="CenterOwner" 将不起作用,因为我们在启动后手动调整窗口大小。因此,我将 WindowSTartupLocation 更改为“Manual”,然后在当前工作区域内手动将窗口居中。

    最后,人们可能会通过使用一些 Win32 互操作调用来获取浏览器的滚动信息,从而使这种技术与 WPF 的 WebBrowser 控件一起工作。不过,使用 WinForms 控件要容易得多。

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多