【问题标题】:WPF Browser is there, but invisibleWPF 浏览器在那里,但不可见
【发布时间】:2021-03-27 15:11:51
【问题描述】:

我正在尝试在一个非常简单的 WPF 应用程序中使用浏览器控件,并且似乎在浏览器加载我请求的页面时(我可以将鼠标悬停在图像上并查看 ALT 标记),但实际上我看不到还要别的吗:

这是应用的 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>

那么谁能帮我弄清楚为什么浏览器没有显示 Yahoo!主页就像我问的那样?虽然我在做这件事,但我要承认这是我的第一个 WPF 应用程序,我很想听听有关如何在我的 XAML 中摆脱一般新手坏事的任何一般性指示。

谢谢。

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    只是一个快速的回复,不幸的是,迟到了......

    你需要设置 AllowsTransparency="False" :)

    【讨论】:

    • 完全正确。非常感谢。不过太糟糕了,因为透明度真的很漂亮。
    • WebBrowser 控件没有 AllowsTransparency 属性...我在这里缺少什么?
    • @DeanKuga 您需要在您的窗口上设置此属性,而不是在您的组件上。希望对你有帮助
    • 为什么窗口透明度会影响浏览器控件??
    • 因为是孩子,所以继承了它的属性
    【解决方案2】:

    WPF WebBrowser 不适用于 AllowsTransparency="True"。

    【讨论】:

      【解决方案3】:

      我刚刚找到了解决方案on this blog。基本上,它只是在 WebControl 应该在的位置上显示另一个窗口......它有点脏,但效果很好:)

      【讨论】:

      • 非常酷,托马斯。谢谢你的提示。我将尝试实施此解决方案。
      【解决方案4】:

      您是否设置了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 新手提示:

      • 避免使用HeightWidth,而是学习布局控件的工作原理(DockPanel、StackPanel、Grid 等)。如果您真的想强制执行某些东西的大小,请考虑使用 MinWidthMinHeight 是否会更好地实现您想要的效果。
      • 默认情况下,大多数控件都具有透明背景,因此您无需将其放入 XAML。
      • 对于屏幕上的文字,我倾向于使用TextBlock 而不是Label。您的里程可能会有所不同,但根据我的经验,大多数示例使用TextBlock

      编辑

      我为您准备了一个替代布局,避免使用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 与图像中看到的不匹配。也许来自这些样式的值会影响您的控制。

      【讨论】:

      • 很好的答案。非常感谢所有对 WPF 更精细点的帮助。我越来越清楚,在 WPF 的表面下有很多微妙之处和艺术。
      • @Adam,不用担心。透明度太差了。我注意到,在 Kaxaml 中,浏览器似乎漂浮在其余元素之上。毫无疑问,它会得到特殊处理并叠加在 UI 的其余部分之上。
      【解决方案5】:

      这是一个老问题,但我想发布我为使其正常工作所做的工作。

      当您想要创建一个没有边框且可调整大小并且能够托管 WebBrowser 控件或指向您根本无法访问的 URL 的 Frame 控件的窗口时,所述控件的内容将显示为空,正如 OP 所说.

      我找到了一个解决方法;在窗口中,如果您将 WindowStyle 设置为 None,将 ResizeMode 设置为 NoResize(请耐心等待,一旦完成,您仍然可以调整大小)然后确保您有 UNCHECKED 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);
          }
      

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

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题并找到了这篇文章。没有人澄清标记为正确的答案。我还没有发表评论的要点。 AllowsTransparency="False" 需要应用于 XAML Window 标记。示例:

        <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">
        

        花了一些挖掘和调查才弄明白,但这样一来,我对不可见浏览器控件的问题就得到了缓解。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 2021-04-09
          • 2014-09-16
          • 2011-12-10
          相关资源
          最近更新 更多