2010-05-31 33 views
12

Próbuję użyć formantu Browser w bardzo prostej aplikacji WPF i wygląda na to, że podczas gdy przeglądarka ładuje stronę, o którą prosiłem (mogę wyświetlać obrazy na myszy i widzieć znaczniki ALT) nie mogę faktycznie zobaczyć coś innego: alt textPrzeglądarka WPF jest tam, ale niewidoczna

Oto XAML dla aplikacji:

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

Więc może ktoś mi pomóc dowiedzieć się, dlaczego przeglądarka nie pokazując Yahoo! strona główna, jak tego poprosiłem? I chociaż jestem przy tym, zamierzam przyznać, że jest to moja pierwsza aplikacja WPF i chciałbym usłyszeć ogólne wskazówki, jak pozbyć się ogólnego zła nooby w moim XAML.

Dzięki.

Odpowiedz

13

Tylko szybka odpowiedź niestety późno ...

Musisz ustawić AllowsTransparency = "false" :)

+0

dokładnie. Wielkie dzięki. Szkoda jednak, ponieważ przezroczystość jest naprawdę ładna. –

1

Czy ustawienie właściwości WebBrowser.Source? Próbowałem następujące XAML w Kaxaml i działał prawidłowo:

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

chodzi o ogólny XAML wskazówek początkujących:

  • Unikaj używania Height i Width i zamiast nauczyć kontrole układu pracy (DockPanel, StackPanel, Siatka, itp.). Jeśli naprawdę chcesz wymusić rozmiar czegoś, zastanów się, czy użycie wartości MinWidth i MinHeight pozwoli osiągnąć lepsze wyniki.
  • Większość elementów sterujących ma domyślnie przezroczyste tło, więc nie trzeba ich umieszczać w swoim XAML.
  • Mam tendencję do faworyzowania TextBlock przez Label dla fragmentów tekstu na ekranie. Twój przebieg może być różny, ale większość przykładów korzysta z mojego doświadczenia z TextBlock.

EDIT

ułożyła alternatywny układ dla ciebie, że unika się stosowania 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> 

może chcesz przejść i zaktualizować marże mają wyglądać jak chcesz tego.

Również z twojego zrzutu ekranu wynika, że ​​masz tu kilka dodatkowych stylów/szablonów, ponieważ XAML nie pasuje do tego, co widać na obrazku. Być może wartości płynące z tych stylów mieszają się z Twoją kontrolą.

+0

Świetna odpowiedź. Bardzo dziękuję za całą pomoc z lepszymi punktami WPF. Staje się dla mnie jasne, że pod powierzchnią WPF jest dużo subtelności i sztuki. –

+0

@Adam, bez obaw. Szkoda w przejrzystości. Zauważyłem, że w Kaxaml przeglądarka wydawała się unosić nad resztą elementów. Bez wątpienia otrzyma on specjalną obsługę i jest nałożony ponad resztę interfejsu użytkownika. –

4

Przeglądarka internetowa WPF nie działa z AllowsTransparency = "True".

1

Właśnie znalazłem rozwiązanie on this blog. Zasadniczo, po prostu pokazuje inne okno na górze, gdzie WebControl powinien być ... jest trochę brudny, ale działa bardzo dobrze :)

+0

BARDZO fajny, Thomas. Dzięki za wskazówkę. Spróbuję wdrożyć to rozwiązanie. –

1

To jest stare pytanie, ale chciałem opublikować to, co zrobiłem aby działało.

Jeśli chcesz utworzyć okno bez ramki, które można zmienić rozmiar i jest w stanie obsługiwać kontrolkę WebBrowser lub kontrolkę ramki wskazującą adres URL, którego po prostu nie można, zawartość tej kontrolki będzie pusta jako OP powiedziany.

Znalazłem obejście chociaż; w oknie, jeśli ustawisz WindowStyle na None, ResizeMode na NoResize (trzymaj się ze mną, nadal będziesz w stanie zmienić rozmiar raz zrobionego), a następnie upewnij się, że posiadasz UNCHECKED AllowsTransparency, będziesz miał okno o rozmiarach statycznych bez ramki i pokaże kontrola przeglądarki.

Teraz nadal chcesz mieć możliwość zmiany rozmiaru, prawda? Dobrze, że możemy się z rozmowy międzyoperacyjne:

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

i voila, Okno WPF bez granic i wciąż ruchomy i zmienny rozmiar bez utraty kompatybilności z ze sterowaniem jak WebBrowser

Powiązane problemy