web-dev-qa-db-ja.com

ローカルのhtmlファイルのコンテンツをUWPWebViewに表示する

これは非常に簡単な作業だと思います。Webで多くの例を見てきましたが、さまざまな例外が発生したため、どれも機能していません。

html:

_<html lang="en">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <p>
        Help html content.
    </p>
</body>
</html>
_

xaml:

_<Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>

        <WebView x:Name="webView" />
        <Button x:Name="buttonRefresh" 
                Grid.Row="1" 
                HorizontalAlignment="Center"
                Click="buttonRefresh_Click">
            Refresh
        </Button>
    </Grid>
_

UWPアプリケーションLocalFolderの_help.html_ファイルに保存されている静的HTMLを表示するには、すでに次のことを試しました。
-ナビゲートメソッドを使用する:

_private void buttonRefresh_Click(object sender, RoutedEventArgs e)
        {
            var uri = new Uri("ms-appdata:///local/help.html");
            webView.Navigate(uri);
        }
_

その結果、次の例外が発生します。

_System.ArgumentException: Value does not fall within the expected range.
   at Windows.UI.Xaml.Controls.WebView.Navigate(Uri source)
   at SimpleUwpApp.Proxy.SimplerPage.buttonRefresh_Click(Object sender, RoutedEventArgs e)
_


-webViewのSourceプロパティをコードビハインドで明示的に設定してみてください:

_private void buttonRefresh_Click(object sender, RoutedEventArgs e)
{
    var uri = new Uri("ms-appdata:///local/help.html");
    webView.Source = uri;
}
_

結果:

_System.ArgumentException: Value does not fall within the expected range.
   at Windows.UI.Xaml.Controls.WebView.put_Source(Uri value)
   at SimpleUwpApp.Proxy.SimplerPage.buttonRefresh_Click(Object sender, RoutedEventArgs e)
_


-webViewのSourceプロパティをxamlで明示的に設定します:これは Microsoftドキュメント の正確な例です。

_<WebView x:Name="webView" Source="ms-appdata:///local/help.html" />
_

結果として、起動時の例外:

_Windows.UI.Xaml.Markup.XamlParseException: The text associated with this error code could not be found.

Failed to assign to property 'Windows.UI.Xaml.Controls.WebView.Source' because the type 'Windows.Foundation.String' cannot be assigned to the type 'Windows.Foundation.Uri'. [Line: 16 Position: 54]
   at Windows.UI.Xaml.Application.LoadComponent(Object component, Uri resourceLocator, ComponentResourceLocation componentResourceLocation)
   at SimpleUwpApp.Proxy.SimplerPage.InitializeComponent()
_


-このようにNavigate()引数でURL文字列を直接使用しようとしました Microsoftの例 しかしNavigate()は受け入れます引数としてUriのみであるため、古いバージョンのxamlツールキットのいずれかでドキュメントが無効になります。

_webView.Navigate("ms-appx-web:///help.html");
_

結果:

_Syntax error.
_

私が一時的に思いついた唯一の解決策は、ある種のファイルマネージャーでhtmlファイルのコンテンツを読み取り、NavigateToString()メソッドを使用することです。

_var content = fileManager.Read("help.html"); // Manually read the content of html file
webView.NavigateToString(content);
_


では、説明されている例が機能しないのはなぜですか? NavigationToStringの使用を回避する方法は?

8
Dmytro

解決策 TheTanicが提供 は、パッケージとともに提供されるファイルに対して機能します。 LocalFolderまたはTemporaryFolderに保存されているファイルの場合、 特別なURIスキームに従う

このスキームのWebViewサポートでは、ローカルフォルダーまたは一時フォルダーの下のサブフォルダーにコンテンツを配置する必要があります。これにより、ms-appdata:///local/folder/file.htmlやms-appdata:///temp/folder/file.htmlなどのURI(Uniform Resource Identifier)へのナビゲーションが可能になります。

これは、LocalFolderを使用すると、URIが次のように開始されることを意味します。ms-appdata:///local/この後はフォルダでファイル内にある必要があります。作業サンプルは次のとおりです。

StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///help.html"));
StorageFolder folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("anyFolder", CreationCollisionOption.OpenIfExists);
await file.CopyAsync(folder, "help.html", NameCollisionOption.ReplaceExisting);
webView.Navigate(new Uri("ms-appdata:///local/anyFolder/help.html"));

使用されるすべてのコンテンツは、次のようにそのフォルダーにも存在する必要があることにも注意してください。

これらの第1レベルのサブフォルダーはそれぞれ、他の第1レベルのサブフォルダーのコンテンツから分離されています。

5
Romasz

だから私は2つの異なるものを手に入れました、それは私のために働きました:

XAMLバージョン:

<WebView x:Name="webView" Source="ms-appx-web:///help.html"/>

ここでは、ms-appx-webプレフィックスを使用する必要があります。

コードビハインドバージョン:

webView.Navigate(new Uri("ms-appx-web:///help.html"));

お使いのバージョンとの違いは、文字列のみを入力することは許可されていないということです。 Uri- Classの新しいオブジェクトを作成する必要があります。

どちらのバージョンでも、html-ファイルはプロジェクトの直接の子であり、プロジェクトはWindows-10-UWP Applicationです[Windows8またはWindows10を使用している場合は言わなかった]

7
TheTanic