Подтвердить что ты не робот

Браузер WPF есть, но невидимый

Я пытаюсь использовать элемент управления браузера в очень простом WPF-приложении, и кажется, что, когда браузер загружает запрашиваемую мной страницу (я могу рисовать мышью изображения и видеть теги ALT), я не вижу на самом деле что-нибудь еще: alt text

Вот XAML для приложения:

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

Так может кто-нибудь помочь мне понять, почему браузер не показывает Yahoo! как я его просил? И пока я нахожусь в этом, я собираюсь признать, что это мое первое приложение WPF, и мне бы хотелось услышать какие-либо общие указания о том, как избавиться от общей ошибки noobie в моем XAML.

Спасибо.

4b9b3361

Ответ 1

Просто быстрый ответ, к сожалению, опаздывает...

Вам нужно установить AllowsTransparency = "False":)

Ответ 2

Веб-браузер WPF не работает с AllowsTransparency = "True".

Ответ 3

Вы устанавливаете свойство WebBrowser.Source? Я попробовал следующий XAML в Kaxaml, и он отлично работал:

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

Как для общих советов новичков XAML:

  • Избегайте использования Height и Width, а затем узнайте, как работают элементы управления макетами (DockPanel, StackPanel, Grid и т.д.). Если вы действительно хотите обеспечить какой-то размер, подумайте, сможет ли использование MinWidth и MinHeight достичь желаемого.
  • Большинство элементов управления имеют прозрачный фон по умолчанию, поэтому вам не нужно помещать его в свой XAML.
  • Я предпочитаю TextBlock над Label для фрагментов текста на экране. Ваш пробег может отличаться, но большинство примеров используют TextBlock в своем опыте.

ИЗМЕНИТЬ

Я собрал альтернативный макет для вас, чтобы избежать использования 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>

Вы можете пройти и обновить поля, чтобы они выглядели так, как вы хотите.

Кроме того, с вашего скриншота ясно, что у вас есть дополнительные стили/шаблоны, играющие здесь роль, поскольку XAML не соответствует тому, что видно на изображении. Возможно, ценности, исходящие из этих стилей, беспорядочны с вашим контролем.

Ответ 4

Я только что нашел решение в этом блоге. В принципе, это просто показывает другое окно поверх того, где WebControl должен быть... он немного грязный, но он работает очень хорошо:)

Ответ 5

Это старый вопрос, но я хотел опубликовать то, что я сделал, чтобы заставить его работать.

Если вы хотите создать окно без рамки, которая может быть изменена по размеру и может размещать элемент управления WebBrowser или элемент управления Frame, указывающий на URL-адрес, который вы просто не можете, содержимое указанного элемента управления будет отображаться пустым, поскольку OP сказал.

Я нашел обходное решение; в окне, если вы установите WindowStyle равным None, ResizeMode в NoResize (несите меня, вы все равно сможете изменить размер после завершения), тогда убедитесь, что у вас есть UNCHECKED AllowsTransparency, у вас будет окно статического размера без рамки и покажет управления браузером.

Теперь вы, вероятно, все еще хотите иметь право изменять размер? Ну, мы можем с этим с помощью вызова 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);
    }

И voila, Окно WPF без рамки и все еще подвижное и изменяемое без потери совместимости с элементами управления, такими как WebBrowser