2010-05-31 3 views
12

J'essaie d'utiliser le contrôle Browser dans une application WPF très simple, et il semble que pendant que le navigateur charge la page que j'ai demandée (je peux passer la souris sur les images et voir les balises ALT) , je ne vois pas quoi que ce soit d'autre: alt textWPF Browser est là, mais invisible

Voici le XAML pour l'application:

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

Alors quelqu'un peut me aider à comprendre pourquoi le navigateur ne montre pas le Yahoo! page d'accueil comme je l'ai demandé? Et pendant que j'y suis, je vais reconnaître le fait que c'est ma première application WPF, et j'aimerais entendre des conseils généraux sur la façon de se débarrasser de la mauvaise noobie générale dans mon XAML.

Merci.

Répondre

13

Juste une réponse rapide, malheureusement, se fait tard ...

Vous devez définir AllowsTransparency = "false" :)

+0

Exactement. Merci beaucoup. Dommage, cependant, car la transparence est vraiment jolie. –

1

Vous définissez la propriété WebBrowser.Source? J'ai essayé le XAML suivant dans Kaxaml et il a bien fonctionné:

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

Comme pour les débutants XAML Conseils généraux:

  • Évitez d'utiliser Height et Width et apprendre plutôt comment les commandes de mise en page de travail (DockPanel, StackPanel, Grille, etc.). Si vous voulez vraiment imposer la taille de quelque chose, considérez si l'utilisation MinWidth et MinHeight accomplirait ce que vous vouliez mieux.
  • La plupart des contrôles ont des arrière-plans transparents par défaut, vous n'avez donc pas besoin de les mettre dans votre XAML.
  • J'ai tendance à favoriser TextBlock sur Label pour des morceaux de texte à l'écran. Votre kilométrage peut varier, mais la plupart des exemples utilisent TextBlock selon mon expérience.

EDIT

Je mis en place une disposition alternative pour vous qui permettent d'éviter l'utilisation 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> 

Vous voudrez peut-être passer par et mettre à jour les marges d'avoir l'impression que tu le veux. De plus, à partir de votre capture d'écran, il est clair que d'autres styles/modèles jouent un rôle ici, car le XAML ne correspond pas à ce que l'on voit dans l'image. Peut-être que les valeurs provenant de ces styles perturbent votre contrôle.

+0

Bonne réponse. Merci beaucoup pour toute l'aide avec les subtilités de WPF. Il devient clair pour moi qu'il y a beaucoup de subtilité et d'art sous la surface de WPF. –

+0

@Adam, pas de soucis. Dommage pour la transparence. J'ai noté que, dans Kaxaml, le navigateur semblait flotter au-dessus du reste des éléments. Il ne fait aucun doute qu'il reçoit une manipulation spéciale et se superpose au reste de l'interface utilisateur. –

4

Le WebBrowser WPF ne fonctionne pas avec AllowsTransparency = "True".

1

Je viens de trouver une solution on this blog. Fondamentalement, cela montre juste une autre fenêtre au-dessus de l'endroit où le WebControl est censé être ... c'est un peu sale, mais ça marche très bien :)

+0

TRÈS cool, Thomas. Merci pour le conseil. Je vais essayer de mettre en œuvre cette solution tonght. –

1

Ceci est une vieille question mais je voulais poster ce que j'ai fait pour le faire fonctionner.Lorsque vous voulez créer une fenêtre sans bordure qui est redimensionnable et qui est capable d'héberger un contrôle WebBrowser ou un contrôle Frame pointé vers une URL que vous ne pouviez pas, le contenu de ce contrôle s'afficherait vide comme OP m'a dit.

J'ai trouvé une solution de contournement cependant; dans la fenêtre, si vous définissez le WindowStyle à None, ResizeMode à NoResize (ours avec moi, vous serez toujours en mesure de redimensionner une fois terminé) puis assurez-vous que vous avez UNCHECKED AllowsTransparency vous aurez une fenêtre de taille statique sans bordure et montrera le contrôle du navigateur.

Maintenant, vous voulez probablement toujours pouvoir redimensionner correctement? Eh bien nous pouvons pour que, avec un appel Interop:

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

Et le tour est joué, une fenêtre WPF sans bordure et encore mobile et redimensionnable sans perdre la compatibilité avec des contrôles comme WebBrowser

Questions connexes