C# WPF Displaying WebBrowser on window with AllowTransparency="true" does not display

11,670

Solution 1

I know this is an old question but I had exactly the same problem today and I solved it using

ResizeMode="NoResize"

instead of

Allowstransparency="true"

The ResizeMode does remove the annoing border too and does not impact the WebBrowser control. Seems to be the easiest way to solve your problem in this case :)

Solution 2

This is an old question but I wanted to post what I have done to get it working.

When you want to create a window with no border that is resizeable and is able to host a WebBrowser control or a Frame control pointed to a URL you simply couldn't, the contents of said control would show empty as the OP said.

I found a workaround though; in the Window, if you set the WindowStyle to None, ResizeMode to NoResize (bear with me, you will still be able to resize once done) then make sure you have UNCHECKED AllowsTransparency you will have a static sized window with no border and will show the browser control.

Now, you probably still want to be able to resize right? Well we can to that with a interop call:

    [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);
    }

And voila, A WPF window with no border and still movable and resizable without losing compatibility with with controls like WebBrowser

Share:
11,670
user2840301
Author by

user2840301

Updated on June 04, 2022

Comments

  • user2840301
    user2840301 almost 2 years

    I am displaying a window with a WebBrowser control on it. I want the windows to be frameless so I have set WindowStyle="None" This works BUT displays a colored border around the window. Allowstransparency="true" removes this BUT the WebBrowser is no longer displayed (buttons are)

    I have found http://www.neowin.net/forum/topic/646970-c%23-wpf-window-with-transparency-makes-windowsformshost-disappear/ BUT I cannot get it to work (SetWindowsLong Parameter error)

    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>
    
  • Vincenzo Costa
    Vincenzo Costa almost 9 years
    The response of user3231903 is a good alternative (so that the rated) If you have and want to use transparency I recommend this post blogs.msdn.com/b/changov/archive/2009/01/19/…
  • Gh61
    Gh61 almost 3 years
    No, this is not working. Tried to tweek this solution (Placement=Mouse is wrong, popup keeps closing, ...), but it has so many issues...