none
WebView如何打开本地静态html RRS feed

  • 问题

  • 第一种写法无法加载出网页,第二,第三种写法是可以加载出网页的。请问我该怎么写才能行呢。由于WebBrowser和TextBox都为不定长的情况下,改变窗口大小会造成卡顿,所以暂时只能用WebView。

    xmlns:wpf="clr-namespace:Microsoft.Toolkit.Wpf.UI.Controls;assembly=Microsoft.Toolkit.Wpf.UI.Controls.WebView"
    
    <Grid>
            <wpf:WebView  Source="D:\test.html"></wpf:WebView>
            <!--<wpf:WebView  Source="https://social.msdn.microsoft.com/Forums/zh-CN/3ffef641-5cb5-448b-9e39-2d334eec4cdc/webview?forum=winstoreappzhcn"></wpf:WebView>-->
            <!--<WebBrowser Source="D:\test.html"></WebBrowser>-->
    </Grid> 

    2019年3月19日 9:00

答案

  • 可以用MVVM的方式

    将读取文件方法转为附加属性,将路径作为传递的参数。

    using Microsoft.Toolkit.Wpf.UI.Controls;
    using System.IO;
    using System.Windows;
    
    namespace 本地Html
    {
        public class ATCH
        {
            public static readonly DependencyProperty StaticHtmlProperty = DependencyProperty.RegisterAttached("StaticHtml", typeof(string), typeof(ATCH), new PropertyMetadata(null, new PropertyChangedCallback(StaticHtmlCallBack)));
    
            private static async void StaticHtmlCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (!(d is WebView)||d==null)
                    return;
                var web = d as WebView;
    
                var path = e.NewValue.ToString();
    
                if (string.IsNullOrWhiteSpace(path)||! File.Exists(path))
                    return;
    
                var html = new FileStream(path, FileMode.Open);
    
                var read = new StreamReader(html);
    
                var StrHtml = await read.ReadToEndAsync();
    
                web.NavigateToString(StrHtml);
    
                read.Close();
    
                html.Close();
         
            }
            public static void SetStaticHtml(DependencyObject d, string value) => d.SetValue(StaticHtmlProperty,value);
    
            public string GetStaticHtml(DependencyObject d) => d.GetValue(StaticHtmlProperty).ToString();
    
    
        }
    }

    XAML

      <Grid>
            <controls:WebView x:Name="wb" local:ATCH.StaticHtml="C:\Users\wppcn\Desktop\Test.html" >
                
            </controls:WebView>
        </Grid>

    通过绑定附加的值来进行控制网页访问的路径





    • 已编辑 ARM830 2019年3月21日 12:03
    • 已标记为答案 shared_ptr 2019年3月22日 2:32
    2019年3月21日 11:54

全部回复

  • 一般来说使用MS-appdata方案是可以

    或者是读取本地的Html的文件流

        var s = new FileStream(@"C:\Users\wppcn\Desktop\Test.html",FileMode.Open);
                using (var read = new StreamReader(s))
                {
                    wb.NavigateToString(read.ReadToEnd());
    
    
                }
                 
                s.Close();

    2019年3月21日 2:14
  • 非常感谢您的回复。

    1. 我之前在网上搜到过您贴的图那种方法,试了试ms-appdata:///local/ 这种写法,好像无法使用绝对路径如D:\test.html,麻烦问一下有没有什么方法解决呢?

    2. 假如我用读取本地的Html的文件流 这种用法,有没有办法使用MVVM。

    2019年3月21日 9:01
  • 第一次在这论坛发贴,不知道刚刚是回复成功了吗,麻烦您看一下楼下
    2019年3月21日 9:08
  • 可以用MVVM的方式

    将读取文件方法转为附加属性,将路径作为传递的参数。

    using Microsoft.Toolkit.Wpf.UI.Controls;
    using System.IO;
    using System.Windows;
    
    namespace 本地Html
    {
        public class ATCH
        {
            public static readonly DependencyProperty StaticHtmlProperty = DependencyProperty.RegisterAttached("StaticHtml", typeof(string), typeof(ATCH), new PropertyMetadata(null, new PropertyChangedCallback(StaticHtmlCallBack)));
    
            private static async void StaticHtmlCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (!(d is WebView)||d==null)
                    return;
                var web = d as WebView;
    
                var path = e.NewValue.ToString();
    
                if (string.IsNullOrWhiteSpace(path)||! File.Exists(path))
                    return;
    
                var html = new FileStream(path, FileMode.Open);
    
                var read = new StreamReader(html);
    
                var StrHtml = await read.ReadToEndAsync();
    
                web.NavigateToString(StrHtml);
    
                read.Close();
    
                html.Close();
         
            }
            public static void SetStaticHtml(DependencyObject d, string value) => d.SetValue(StaticHtmlProperty,value);
    
            public string GetStaticHtml(DependencyObject d) => d.GetValue(StaticHtmlProperty).ToString();
    
    
        }
    }

    XAML

      <Grid>
            <controls:WebView x:Name="wb" local:ATCH.StaticHtml="C:\Users\wppcn\Desktop\Test.html" >
                
            </controls:WebView>
        </Grid>

    通过绑定附加的值来进行控制网页访问的路径





    • 已编辑 ARM830 2019年3月21日 12:03
    • 已标记为答案 shared_ptr 2019年3月22日 2:32
    2019年3月21日 11:54
  • 终于把这个东西做好了,真是太谢谢你了。

    先后用了WebBrowser,cefSharpWPF和WebView各有各的问题,前面两个都是卡顿的问题

    2019年3月22日 2:32