代码之家  ›  专栏  ›  技术社区  ›  Adam Crossland

WPF浏览器存在,但不可见

  •  14
  • Adam Crossland  · 技术社区  · 14 年前

    我正试图在一个非常简单的WPF应用程序中使用浏览器控件,当浏览器加载我请求的页面时(我可以鼠标悬停图像并查看alt标记),我实际上看不到任何其他内容:

    这是应用程序的XAML:。

    <window x:class=“smokeybox2.mainwindow”
    xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”(http://schemas.microsoft.com/winfx/2006/xaml/presentation)
    xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”
    title=“smokeybox”height=“120”width=“510”showintaskbar=“false”
    sizeToContent=“widthandheight”windowstyle=“none”allowsTransparency=“true”
    mouseLeftButtonDown=“窗口”mouseLeftButtonDown“>
    <border background=“50ffffff”cornerradius=“5”borderthickness=“2,0,2,2”
    padding=“5 1 5 5”>
    格栅& GT;
    <grid.rowdefinitions>
    <rowdefinition height=“auto”></rowdefinition>
    <rowdefinition height=“auto”></rowdefinition>
    <rowdefinition height=“auto”></rowdefinition>
    </grid.rowdefinitions>
    <grid.columndefinitions>
    <columnDefinition width=“auto”></columnDefinition>
    <columnDefinition width=“auto”></columnDefinition>
    </grid.columndefinitions>
    <label grid.row=“0”grid.column=“0”background=“transparent”content=“smokeybox”
    mouseLeftButtonDown=“标签”mouseLeftButtonDown“/>
    <textbox grid.row=“1”grid.column=“0”name=“SearchText”width=“450”fontfamily=“Arial”foreground=“深灰色”
    background=“transparent”fontsize=“20”mouseLeftButtonDown=“搜索文本”mouseLeftButtonDown“
    borderbrush=“透明”/>
    <expander grid.row=“1”grid.column=“1”padding=“2 3 0 0”expanded=“expander_expanded”
    colled=“expander_colled”/>
    <webbrowser grid.row=“2”grid.column=“0”x:name=“browser”visibility=“可见”
    width=“480”height=“480”margin=“2 2 2 2 2”></webbrowser>
    和/格栅& GT;
    &边界/gt;
    &窗/窗;
    < /代码> 
    
    

    有人能帮我弄明白为什么浏览器没有显示雅虎吗?我要求的主页?当我在这里的时候,我会承认这是我的第一个WPF应用程序,我很想听到关于如何在我的XAML中消除一般性的Noobie坏处的任何一般性的提示。

    谢谢。正在加载我请求的页面(我可以鼠标悬停图像并查看alt标记),但实际上我看不到任何其他内容: alt text

    以下是应用程序的XAML:

    <Window x:Class="SmokeyBox2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="SmokeyBox" Height="120" Width="510" ShowInTaskbar="False"
            SizeToContent="WidthAndHeight" WindowStyle="None" AllowsTransparency="True"
            MouseLeftButtonDown="Window_MouseLeftButtonDown">
        <Border Background="#50FFFFFF" CornerRadius="5" BorderThickness="2,0,2,2"
                Padding="5 1 5 5">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" Grid.Column="0" Background="Transparent"  Content="SmokeyBox" 
                       MouseLeftButtonDown="Label_MouseLeftButtonDown" />
                <TextBox Grid.Row="1" Grid.Column="0" Name="searchText" Width="450" FontFamily="Arial" Foreground="DarkGray"
                         Background="Transparent" FontSize="20" MouseLeftButtonDown="searchText_MouseLeftButtonDown"
                         BorderBrush="Transparent" />
                <Expander Grid.Row="1" Grid.Column="1" Padding="2 3 0 0 " Expanded="Expander_Expanded"
                          Collapsed="Expander_Collapsed" />
                <WebBrowser Grid.Row="2" Grid.Column="0" x:Name="browser" Visibility="Visible"
                            Width="480" Height="480" Margin="2 2 2 2" ></WebBrowser>
            </Grid>
        </Border>
    </Window>
    

    有人能帮我弄明白为什么浏览器没有显示雅虎吗?我要求的主页?当我在这的时候,我会承认这是我的第一个WPF应用程序,我很想听到任何关于如何摆脱我的XAML中一般的不好的一般性的建议。

    谢谢。

    6 回复  |  直到 6 年前
        1
  •  14
  •   Tim Lloyd    14 年前

    只是一个很快的答复,不幸的是,越来越晚了…

    您需要设置allowsTransparency=“false”:)

        2
  •  5
  •   Bob Ross    14 年前

    WPF WebBrowser不适用于allowsTransparency=“true”。

        3
  •  1
  •   Drew Noakes    14 年前

    你在设置 WebBrowser.Source 财产?我在kaxaml中尝试了以下xaml,但效果很好:

        <Page
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
            <Border>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"></RowDefinition>
                        <RowDefinition Height="Auto"></RowDefinition>
                        <RowDefinition Height="Auto"></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" Text="SmokeyBox" />
                    <TextBox Grid.Row="1" Grid.Column="0" Name="searchText" FontFamily="Arial" Foreground="DarkGray"
                             Background="Transparent" FontSize="20" BorderBrush="Transparent" />
                    <Expander Grid.Row="1" Grid.Column="1" Padding="2 3 0 0" />
                    <WebBrowser Source="http://www.yahoo.com" Grid.Row="2" Grid.Column="0" x:Name="browser" Visibility="Visible"
                                Margin="2 2 2 2" />
                </Grid>
            </Border>
        </Page>
    

    对于一般的XAML新手提示:

    • 避免使用 Height Width 而不是学习布局控件如何工作(DockPanel、StackPanel、Grid等)。如果您真的想强制某个对象的大小,请考虑是否使用 MinWidth MinHeight 会达到你想要的更好。
    • 默认情况下,大多数控件都有透明的背景,因此不需要将其放入XAML中。
    • 我倾向于赞成 TextBlock 结束 Label 屏幕上的文本。您的里程可能会有所不同,但大多数示例都使用 控件 以我的经验。

    编辑

    我为你安排了一个替代的布局,避免使用 Grid :

        <Page
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
            <Border>
                <DockPanel>
                    <TextBlock DockPanel.Dock="Top" Text="SmokeyBox" />
                    <DockPanel DockPanel.Dock="Top">
                        <Expander DockPanel.Dock="Right" Padding="2 3 0 0" />
                        <TextBox Name="searchText" FontFamily="Arial" FontSize="20" />
                    </DockPanel>
                    <WebBrowser Source="http://www.yahoo.com" x:Name="browser" Margin="2 2 2 2" />
                </DockPanel>
            </Border>
        </Page>
    

    您可能需要浏览并更新页边距,使其看起来像您想要的那样。

    此外,从屏幕截图中可以清楚地看到,由于XAML与图像中的不匹配,因此在这里您有一些额外的样式/模板发挥作用。也许来自这些风格的价值观干扰了你的控制。

        4
  •  1
  •   Thomas Levesque    14 年前

    我刚找到解决办法 on this blog . 基本上,它只是在WebControl应该位于的顶部显示另一个窗口…有点脏,但效果很好:)

        5
  •  1
  •   Wobbles    10 年前

    这是一个古老的问题,但我想把我所做的工作发布出来。

    如果要创建一个没有边框的窗口,该窗口的大小可以调整,并且能够承载WebBrowser控件或指向您无法执行的URL的帧控件,则该控件的内容将显示为空。

    不过,我找到了一个解决方法;在窗口中,如果将WindowsStyle设置为“无”,则将ResizeMode设置为Noresize(请放心,完成后您仍可以调整大小),然后确保未选中AllowsTransparency,您将拥有一个静态大小的无边框窗口,并将显示浏览器控件。

    现在,您可能仍然希望能够调整大小,对吗?好吧,我们可以通过互操作调用来实现这一点:

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
        [DllImportAttribute("user32.dll")]
        public static extern bool ReleaseCapture();
    
        //Attach this to the MouseDown event of your drag control to move the window in place of the title bar
        private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown
        {
            ReleaseCapture();
            SendMessage(new WindowInteropHelper(this).Handle,
                0xA1, (IntPtr)0x2, (IntPtr)0);
        }
    
        //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window
        private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
        {
            HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
            SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero);
        }
    

    Voila,一个没有边框的WPF窗口,仍然可以移动和调整大小,而不会与WebBrowser等控件失去兼容性。

        6
  •  0
  •   BroxSoft    6 年前

    我有同样的问题,找到了这个帖子。没有人澄清标记为正确的答案。我还没有简单的评论。allowsTransparency=“false”需要应用于xaml窗口标记。例子:

    <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="WebBrowserControlSample.MainWindow"
    Title="WebBrowser Control Sample"
    MinHeight="200" MinWidth="200"
    Height="600" Width="800"
    WindowStartupLocation="CenterScreen" Background="LightSteelBlue"
    AllowsTransparency="False">
    

    经过一些挖掘和调查,我终于明白了这一点,但由于这一点,我对不可见浏览器控件的问题得到了缓解。