2

我目前正在尝试在 WinRT 应用程序(没有 c#)中显示 webview。首先,可能吗?

我目前正在尝试这样做:

Windows::UI::Xaml::Controls::WebView^ webView = ref new Windows::UI::Xaml::Controls::WebView();
webView->NavigateToString("http://www.google.com");

但是因为我希望这段代码在主线程中运行(我认为,创建一个 UI 元素是强制性的),所以我运行它是这样的:

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->GetForCurrentThread()->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler(
    []
    {
        Windows::UI::Xaml::Controls::WebView^ webView = ref new Windows::UI::Xaml::Controls::WebView();
        webView->NavigateToString("http://www.google.com");
    }
));

不好的一点是这一行:

webView->NavigateToString("http://www.google.com");

永远达不到。在输出控制台中,我在该行引发了三个异常(在逐步调试时):

Windows::UI::Xaml::Controls::WebView^ webView = ref new Windows::UI::Xaml::Controls::WebView();

引发的异常如下:

First-chance exception at 0x763B4B32 in Direct3DApp1.exe: Microsoft C++ exception: Platform::WrongThreadException ^ at memory location 0x0320EFE4. HRESULT:0x8001010E
First-chance exception at 0x763B4B32 in Direct3DApp1.exe: Microsoft C++ exception: Platform::WrongThreadException ^ at memory location 0x0320EFE4. HRESULT:0x8001010E
First-chance exception at 0x763B4B32 (KernelBase.dll) in Direct3DApp1.exe: 0x40080201: WinRT originate error (parameters: 0x8001010E, 0x00000051, 0x0320E494).

如果您知道如何在 Windows 8(不是 Windows Phone 8)上创建 webview 并将其显示在仅限 C++ 的应用程序中,那就太好了。同时,我强烈考虑将 webkit 集成到我的应用程序中,如果它可以帮助我仅在 C++ 中显示 webkit webview。

谢谢

4

1 回答 1

0

使用这样的 XAML:

<Page
    x:Class="Win81CPlusPlus.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Win81CPlusPlus"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
          x:Name="grid">

    </Grid>
</Page>

和这样的 C++ 代码:

MainPage::MainPage()
{
    InitializeComponent();
    auto webView = ref new Windows::UI::Xaml::Controls::WebView();

    Grid^ grid = safe_cast<Grid^>(this->FindName("grid"));
    grid->Children->Append(webView);

    auto uri = ref new Uri(L"http://www.stackoverflow.com");
    webView->Navigate(uri);
    // or you could ...
    //webView->NavigateToString(L"<html><body><h1>Hello</h1></body></html>");
}

您可以构造、添加到父级并导航到 URL(或字符串)。

您也可以使用Dispatcher

Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->GetForCurrentThread()->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
    ref new Windows::UI::Core::DispatchedHandler(
    [this]   /* the this won't likely make sense from another thread */
    {
        auto webView = ref new Windows::UI::Xaml::Controls::WebView();
                    // will need to get access to the grid
        auto grid = safe_cast<Grid^>(this->FindName("grid"));
        grid->Children->Append(webView);
        auto uri = ref new Uri(L"http://www.google.com");
        webView->Navigate(uri);
        //webView->NavigateToString("http://www.google.com");
    }
));

问题是您需要访问WebView将添加实例的父元素。

于 2013-11-07T17:28:07.653 回答