2010-05-31 18 views
12

Estoy intentando utilizar el control del navegador en una aplicación WPF muy simple, y parece que mientras el navegador carga la página que solicité (puedo desplazar imágenes y ver las etiquetas ALT) , me parece que no había otra cosa: alt textEl navegador WPF está ahí, pero es invisible

Aquí es el XAML para la aplicación:

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

Así puede alguien ayudarme a averiguar por qué el navegador no muestra la Yahoo! página de inicio como lo pedí? Y mientras estoy en ello, voy a admitir que esta es mi primera aplicación WPF, y me encantaría escuchar consejos generales sobre cómo deshacerse de la maldad noobie general en mi XAML.

Gracias.

Respuesta

13

Sólo una rápida respuesta por desgracia, se hace tarde ...

Es necesario establecer AllowsTransparency = "false" :)

+0

Exactamente. Muchas gracias. Lástima, sin embargo, ya que la transparencia es muy bonita. –

1

¿Está estableciendo la propiedad WebBrowser.Source? He intentado lo siguiente XAML en Kaxaml y funcionó bien:

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

En cuanto a los consejos de novato XAML en general:

  • Evitar el uso de Height y Width y en lugar de aprender los controles de diseño trabajan (DockPanel, StackPanel, Cuadrícula, etc.). Si realmente quiere imponer el tamaño de algo, considere si usar MinWidth y MinHeight lograría lo que quería mejor.
  • La mayoría de los controles tienen fondos transparentes de forma predeterminada, por lo que no necesita poner eso en su XAML.
  • Tiendo a favor de TextBlock sobre Label para trozos de texto en la pantalla. Su kilometraje puede variar, pero la mayoría de los ejemplos usan TextBlock en mi experiencia.

EDITAR

que armar un diseño alternativo para usted que evite el uso de 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> 

es posible que desee ir a través y actualizar los márgenes para que se vea tan quieres que lo haga

Además, a partir de su captura de pantalla, está claro que tiene algunos estilos/plantillas adicionales que desempeñan un papel aquí ya que el XAML no coincide con lo que se ve en la imagen. Tal vez los valores que provienen de esos estilos están jugando con su control.

+0

Gran respuesta. Muchas gracias por toda la ayuda con los puntos más finos de WPF. Cada vez me queda más claro que hay mucha sutileza y arte bajo la superficie de WPF. –

+0

@ Adam, sin preocupaciones. Lástima de la transparencia. Noté que, en Kaxaml, el navegador parecía flotar sobre el resto de los elementos. Sin duda, tiene un manejo especial y se superpone por encima del resto de la IU. –

4

WPF WebBrowser no funciona con AllowsTransparency = "True".

1

Acabo de encontrar una solución on this blog. Básicamente, solo muestra otra ventana en la parte superior de donde se supone que está WebControl ... está un poco sucio, pero funciona muy bien :)

+0

MUY guay, Thomas. Gracias por el consejo. Intentaré implementar esta solución tonght. –

1

Esta es una vieja pregunta, pero quería publicar lo que hice para que funcione

Cuando desee crear una ventana sin borde que se pueda cambiar de tamaño y pueda alojar un control WebBrowser o un control de Marco apuntando a una URL que simplemente no podría, el contenido de dicho control se mostraría vacío como OP dijo.

Encontré una solución; en la ventana, si configura WindowStyle en None, ResizeMode en NoResize (aguénteme, todavía podrá cambiar el tamaño una vez hecho) luego asegúrese de que tiene una ventana de tamaño estático sin borde y mostrará el control del navegador.

Ahora, probablemente todavía desee poder cambiar el tamaño, ¿verdad? Así que podemos para que con una llamada de interoperabilidad:

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

y listo, una ventana de WPF sin frontera y todavía movible y puede cambiar de tamaño sin perder la compatibilidad con los controles como WebBrowser

Cuestiones relacionadas