วิธีโหลดไฟล์ html ในเครื่องในรูปแบบ xamarin webview

ฉันกำลังพยายามโหลดไฟล์ html ที่อยู่ในเส้นทางเดียวกับชั้นเรียนที่ฉันทำงานด้วยผ่านมุมมองเว็บในรูปแบบ xamarin เมื่อฉันเรียกใช้แอป ฉันได้รับหน้าจอสีขาวและไม่มีอะไรโหลด นี่คือรหัสของฉัน:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace App.Plan
{
    public partial class Tornado : ContentPage
    {
        public Tornado()
        {
            InitializeComponent();
            var browser = new WebView
            {
                Source = "local.html"
};
    }
    }
}

person Phoneswapshop    schedule 27.06.2016    source แหล่งที่มา
comment
ฉันขอแนะนำให้คุณดูเอกสารประกอบ developer.xamarin.com/ guides/xamarin-forms/working-with/webview บอกว่าให้วางไว้ในโฟลเดอร์ Resources สำหรับ iOS/ โฟลเดอร์ Assets สำหรับ Android และอย่าลืมตั้งค่าการดำเนินการสร้างของคุณเป็น BundleResource สำหรับ iOS และ AndroidAsset สำหรับ Android   -  person Bearcat9425    schedule 27.06.2016
comment
ฉันได้ทำสิ่งนี้แล้วและยังคงได้รับปัญหาเดียวกันนี้ มีข้อเสนอแนะอื่นอีกหรือไม่ ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว! :)   -  person Phoneswapshop    schedule 27.06.2016
comment
หากต้องการโหลดไฟล์ html ในเครื่องสำหรับมุมมองเว็บ คุณต้องตั้งค่าคุณสมบัติ BaseUrl เพื่อบอกมุมมองเว็บว่าจะใช้คำนำหน้าใดในการแก้ไขไฟล์ คุณจะต้องทำสิ่งนี้ในแต่ละแพลตฟอร์ม ดังนั้นการใช้งานเฉพาะแพลตฟอร์มของคุณในการเข้าถึงเส้นทางนั้นและไฟล์ HTML ในเครื่องอยู่ที่ไหน สิ่งที่คุณโพสต์จะได้ผลหากคุณโทรหาเว็บไซต์อินเทอร์เน็ตที่จะแปลเป็น UrlWebViewSource local.html จะไม่แปลดังนั้นเหตุใดคุณจึงไม่เห็นอะไรเลย   -  person Bearcat9425    schedule 27.06.2016
comment
@ Bearcat9425 ขอบคุณสำหรับคำตอบ ฉันเข้าใจสิ่งที่คุณพูด แต่ฉันค่อนข้างใหม่กับ c# คุณช่วยยกตัวอย่างสิ่งที่คุณแนะนำให้ฉันทำได้ไหม? ขอบคุณ :)   -  person Phoneswapshop    schedule 27.06.2016
comment
อ่าน developer.xamarin.com/recipes/cross นี้ -platform/xamarin-forms/ มันแสดงให้เห็นสำหรับทั้ง 3 แพลตฟอร์ม   -  person Athul Harikumar    schedule 27.06.2016
comment
ลิงก์ที่ฉันให้ไว้ในความคิดเห็นแรกมีสิ่งที่คุณกำลังมองหาเท่าที่มีตัวอย่าง ดึงจากหน้าเว็บ โหลด HTML เป็นสตริง และยังโหลด HTML ในเครื่องจากระบบปฏิบัติการ   -  person Bearcat9425    schedule 27.06.2016


คำตอบ (3)


Xamarin มีเอกสารเกี่ยวกับสิ่งนี้:

https://developer.xamarin.com/guides/xamarin-forms/user-interface/webview/

var browser = new WebView();
var htmlSource = new HtmlWebViewSource();
htmlSource.Html = @"<html><body>
  <h1>Xamarin.Forms</h1>
  <p>Welcome to WebView.</p>
  </body></html>";
browser.Source = htmlSource;
person Mario Galván    schedule 27.06.2016

นี่คือตัวอย่างอย่างเป็นทางการใน GitHub

WorkingWithWebview

tabs.Children.Add (new LocalHtml {Title = "Local" });
tabs.Children.Add (new LocalHtmlBaseUrl {Title = "BaseUrl" });
tabs.Children.Add (new WebPage { Title = "Web Page"});
tabs.Children.Add (new WebAppPage {Title ="External"});

แท็บที่สองอาจช่วยได้

person Max CHien    schedule 07.04.2017

ฉันรู้ว่านี่เป็นเรื่องเก่า แต่เอกสารประกอบอาจไม่ชัดเจนทั้งหมดเมื่อพูดถึงไฟล์ในเครื่อง ดังนั้นฉันคิดว่าฉันจะแบ่งปันความคิดของฉัน หวังว่าจะเป็นประโยชน์กับทุกคนที่สะดุดที่นี่

เอกสารประกอบระบุว่า:

หากต้องการแสดงเนื้อหาในเครื่องโดยใช้ WebView คุณจะต้องเปิดไฟล์ HTML เช่นเดียวกับไฟล์อื่นๆ จากนั้นโหลดเนื้อหาเป็นสตริงลงในคุณสมบัติ Html ของ HtmlWebViewSource

สิ่งสำคัญที่ควรทราบคือคุณสมบัติ Source ของ WebView มีไว้สำหรับ URL ภายนอกหรือ HtmlWebViewSource เท่านั้น คุณไม่สามารถใส่ URL ในเครื่องในคุณสมบัติแหล่งที่มา การใช้ถ้อยคำ คุณจะต้องเปิดไฟล์ HTML เช่นเดียวกับวิธีอื่นๆ (ตามที่ระบุไว้หลังจากนั้นไม่นาน) ที่คุณต้องโหลดเนื้อหาของไฟล์จากดิสก์ลงในตัวแปรโดยใช้เส้นทางไฟล์แบบเต็ม ไม่ใช่ URL

คำถามก็จะกลายเป็น แล้วลิงค์ไปยังไฟล์ในเครื่องอื่น ๆ ล่ะ? นั่นคือสิ่งที่คุณสมบัติ BaseUrl ของ HtmlWebViewSource เข้ามามีบทบาท เอกสารระบุถึงสิ่งนี้โดยระบุสิ่งต่อไปนี้:

แม้ว่าหน้าแรกจะโหลดแล้ว แต่ WebView ก็ไม่รู้ว่า HTML มาจากไหน นั่นเป็นปัญหาเมื่อต้องจัดการกับเพจที่อ้างอิงถึงแหล่งข้อมูลในเครื่อง ตัวอย่างที่อาจเกิดขึ้น ได้แก่ เมื่อเพจท้องถิ่นลิงก์ถึงกัน เพจใช้ไฟล์ JavaScript แยกต่างหาก หรือเพจลิงก์ไปยังสไตล์ชีต CSS

กล่าวอีกนัยหนึ่ง ลิงก์ใดๆ ไปยังแหล่งข้อมูลในเครื่องใน HTML ของคุณจะถูกต่อท้ายด้วย BaseUrl โดย Webview โดยอัตโนมัติ

เพื่อสรุปสิ่งต่างๆ

สร้างอินเทอร์เฟซ IBaseUrl ในโปรเจ็กต์ที่แชร์ของคุณ

public interface IBaseUrl { 
    string Get(); 
}

สร้างการใช้งานเฉพาะแพลตฟอร์มของ IBaseUrl ในแต่ละโครงการแพลตฟอร์ม

ไอโอเอส:

[assembly: Dependency (typeof (BaseUrl_iOS))]
namespace WorkingWithWebview.iOS
{
  public class BaseUrl_iOS : IBaseUrl
  {
    public string Get()
    {
      return NSBundle.MainBundle.BundlePath;
    }
  }
}

หุ่นยนต์

[assembly: Dependency (typeof(BaseUrl_Android))]
namespace WorkingWithWebview.Android
{
  public class BaseUrl_Android : IBaseUrl
  {
    public string Get()
    {
      return "file:///android_asset/";
    }
  }
}

UWP

[assembly: Dependency(typeof(BaseUrl))]
namespace WorkingWithWebview.UWP
{
    public class BaseUrl : IBaseUrl
    {
        public string Get()
        {
            return "ms-appx-web:///";
        }
    }
}

ตรวจสอบให้แน่ใจว่าไฟล์ HTML ของคุณอยู่ในโฟลเดอร์ที่เหมาะสมและมี Build Action ที่เหมาะสม

  • iOS: ทรัพยากร การดำเนินการบิวด์: BundleResource
  • Android: เนื้อหา, การดำเนินการสร้าง: AndroidAsset
  • UWP: รูทโปรเจ็กต์, การดำเนินการสร้าง: เนื้อหา

ตรวจสอบให้แน่ใจว่า WebView มีคำขอความสูงและความกว้าง ไม่เช่นนั้นอาจไม่แสดงผล:

อาจจำเป็นต้องตั้งค่าคุณสมบัติ widthRequest และ HeightRequest ของ WebView เพื่อดูเนื้อหา HTML ขึ้นอยู่กับเค้าโครงที่ WebView เป็นลูกของ ตัวอย่างเช่น สิ่งนี้จำเป็นใน StackLayout

เมื่อการตั้งค่าเสร็จสิ้น คุณสามารถนำไปใช้จริงในโปรเจ็กต์ที่แชร์ของคุณได้ นี่เป็นตัวอย่างง่ายๆ:

// Use DI function to get the BaseUrl for the platform
var baseUrl = DependencyService.Get<IBaseUrl>().Get();

// You could append subfolders here if you don't 
// want all the HTML files mixed with other resources:
// var baseUrl = System.IO.Path.Combine(DependencyService.Get<IBaseUrl>().Get(), "subfolder");

// Define the location of your initial HTML page using the base url
var initialHtmlPath = System.IO.Path.Combine(baseUrl, "index.html");

// Create the viewsource, loading the first HTML file as a string
var localHtmlViewSource = new HtmlWebViewSource();
localHtmlViewSource.BaseUrl = baseUrl;
localHtmlViewSource.Html = System.IO.File.ReadAllText(initialHtmlPath);

// Set the webview to use the local source
HelpWebView.Source = localHtmlViewSource;
person kiddailey    schedule 02.03.2021