【问题标题】:C# WPF Displaying WebBrowser on window with AllowTransparency="true" does not displayC# WPF 在 AllowTransparency="true" 的窗口上显示 WebBrowser 不显示
【发布时间】:2021-09-24 12:30:50
【问题描述】:

我正在显示一个带有 WebBrowser 控件的窗口。 我希望窗户是无框的,所以我设置了 WindowStyle="None" 这可行,但在窗口周围显示彩色边框。 Allowstransparency="true" 删除此但 WebBrowser 不再显示(按钮)

我找到了http://www.neowin.net/forum/topic/646970-c%23-wpf-window-with-transparency-makes-windowsformshost-disappear/ 但我无法让它工作(SetWindowsLong 参数错误)

Window x:Class="ZoomBrowserWPF.WebWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:UMenu"
        Title="Test" Height="605" Width="700" ResizeMode="CanResizeWithGrip"
        Loaded="Window_Loaded" Unloaded="Window_Unloaded"
        WindowStyle="None"        
        Background="Transparent"              
        Left="1" Top="1"
        UseLayoutRounding="True" SizeChanged="Window_SizeChanged" >
    <Border Name="WindowBorder"  BorderBrush="Black" BorderThickness="1" CornerRadius="10"     Background="Beige">
    <Grid>        
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="30"/>
            <RowDefinition/>
            <RowDefinition Height="33"/>
            <RowDefinition Height="25.5"/>
        </Grid.RowDefinitions>
        <Grid x:Name="GridWebBrowser" Grid.Row="2" Grid.RowSpan="2">            
            <WebBrowser x:Name="webBrowser"  Grid.ColumnSpan="2" Visibility="Visible"
                         Margin="0,0,-16,0" 
                        ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                        ScrollViewer.VerticalScrollBarVisibility="Auto" 
                        ScrollViewer.IsDeferredScrollingEnabled="False"
                        ScrollViewer.CanContentScroll="False"
                        />
        </Grid>
        <Button x:Name="btnZoomIn" Content="Zoom in" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="12,0,0,0"  VerticalAlignment="Top" Width="75" Click="btnZoomIn_Click" />
        <Button x:Name="btnZoomOut" Content="Zoom out" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="168,0,0,0"  VerticalAlignment="Top" Width="75" Click="btnZoomOut_Click" />
        <TextBlock Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="102,0,0,0" Name="txtZoom" Text="100" VerticalAlignment="Top" Width="60" />
    </Grid>
    </Border>
</Window>

【问题讨论】:

    标签: c# wpf webbrowser-control


    【解决方案1】:

    我知道这是一个老问题,但我今天遇到了完全相同的问题,我用它解决了它

    ResizeMode="NoResize"
    

    而不是

    Allowstransparency="true"
    

    ResizeMode 确实也移除了烦人的边框,并且不会影响 WebBrowser 控件。在这种情况下,似乎是解决您的问题的最简单方法:)

    【讨论】:

    【解决方案2】:

    它不能通过 WPF 诡计起作用,因为 WebBrowser 控件实际上不是 WPF 控件。 它是一个封装的 ActiveX IE Web 浏览器控件,不是由 WPF 呈现的。

    也许您的问题与这篇帖子Removing border from WebBrowser control有关。

    老实说,如果可能的话,试着放弃这个糟糕的 WebControl 并使用其他东西。 有适当 WPF 支持的免费替代品,例如 Awesomium.NET、CefSharp 或 CefGlue.NET(均基于 Chromium)。

    【讨论】:

    • 这就是我用的:-)
    【解决方案3】:

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

    当您想要创建一个没有边框且可调整大小并且能够托管 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 等控件的兼容性

    【讨论】:

      【解决方案4】:

      我查看了您发布的来源,它对我有用。 代码如下:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Runtime.InteropServices;
      using System.Text;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Data;
      using System.Windows.Documents;
      using System.Windows.Input;
      using System.Windows.Interop;
      using System.Windows.Media;
      using System.Windows.Media.Imaging;
      using System.Windows.Shapes;
      
      namespace PAUL.Allgemein.Seiten
      {
      /// <summary>
      /// Interaktionslogik für Robbe.xaml
      /// </summary>
      public partial class Robbe : Window
      {
          #region The Classic Window API
          //The SendMessage function sends a message to a window or windows.
          [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
          static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
      
          //ReleaseCapture releases a mouse capture
          [DllImportAttribute("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
          public static extern bool ReleaseCapture();
      
          //SetWindowLong lets you set a window style
          [System.Runtime.InteropServices.DllImport("user32.dll")]
          static extern int SetWindowLong(IntPtr hWnd, int nIndex, long dwNewLong);
          #endregion
      
          const int GWL_STYLE = -16;
          const long WS_POPUP = 2147483648;
      
          //private const int GWL_STYLE = -16;
          //private const int WS_SYSMENU = 0x80000;
          //[DllImport("user32.dll", SetLastError = true)]
          //private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
          //[DllImport("user32.dll")]
          //private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
          public Robbe()
          {
      
              InitializeComponent();
          }
      
          private void Window_Loaded(object sender, RoutedEventArgs e)
          {
              IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
              SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
          }
      }
      }
      

      和 Xaml 代码:

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="Robbe" Height="300" Width="300"
          Loaded="Window_Loaded">
      <Grid>
          <!-- Creates the shadow on the right and bottom -->
          <Border Focusable="False" BorderBrush="Gray"           
              BorderThickness="0,0,2,2"
              CornerRadius="10"
              Background="Beige" >
              <WebBrowser Source="C:\Users\nicholas\Desktop\puale\PAUL\bin\Debug\robbe.swf" Margin="62,71,69,56"></WebBrowser>
          </Border>
      </Grid>
      

      【讨论】:

        【解决方案5】:

        当我遇到与 SystemWebBrowser 控件类似的问题时,我遇到了这个问题,我需要删除顶部空格并将 ResizeMode 保持为 CanResize。所以,我不得不多搜索一点来找到解决方案。解决方案是使用WindowChrome并将CaptionHeight设置为0,如下所示,

        <WindowChrome.WindowChrome>
        <WindowChrome 
            CaptionHeight="0"
            ResizeBorderThickness="5" />
        </WindowChrome.WindowChrome>
        

        这样你可以保留其他属性,例如,

            ResizeMode="CanResize"
            WindowStyle="None"
        

        并保留 AllowsTransparency 的默认值

        【讨论】:

          【解决方案6】:

          你可以做的是将 webbrowser 控件包装到一个弹出控件,该控件具有可以设置为 false 的 AllowTransparency 属性,当然它是浮动的缺点是使 webbrowser 控件适合你的目标位置

           <Grid Grid.Row="1"
                 Grid.Column="2">
                 <Grid Name="grdBrowser" 
                       Background="White"></Grid>
                          <Popup AllowsTransparency="False" 
                                 Height="{Binding Path=Height,ElementName=grdBrowser}"
                                 Width="{Binding Path=Width,ElementName=grdBrowser}"
                                 IsOpen="True"
                                 Placement="Mouse" 
                                 PlacementTarget="{Binding ElementName=grdBrowser}">
                                      <WebBrowser/>
                          </Popup>
          
           </Grid>
          

          【讨论】:

          • 不,这不起作用。试图调整这个解决方案(Placement=Mouse 错误,弹出窗口不断关闭,......),但它有很多问题......
          猜你喜欢
          • 2018-05-07
          • 1970-01-01
          • 1970-01-01
          • 2019-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多