如何将Xamarin.Forms WebView对象转换为特定于平台的WebView对象?

时间:2016-06-04 09:52:41

标签: c# xamarin webview xamarin.forms

我有一个在Xamarin.Forms中创建的WebView对象:

WebView webView = new WebView {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };

我需要对这个对象做一些特定于平台的操作:调用Xamarin.Forms中不可用的一些函数,因为它们在不同平台上的性质不同。

问题是,当我传递Xamarin.Forms对象时:

public interface IWebViewCallCSharp
{
    void passWebView(WebView webView);
}

我可以在"本地方面"与我在Xamarin.Forms中完全相同的事情。如何在每个平台上获得WebView的一些特定于平台的功能?如何将this转换为this

1 个答案:

答案 0 :(得分:1)

您需要实现一个所谓的自定义渲染器。从这里开始:Implementing a HybridWebView

简而言之,您需要:

  1. 创建HybridWebView自定义控件。
  2. 从Xamarin.Forms中使用HybridWebView。
  3. 为。创建自定义渲染器 每个平台上都有HybridWebView。
  4. 在最后一步中你需要

    1. 创建呈现自定义控件的ViewRenderer类的子类。第一个类型参数应该是渲染器用于的自定义控件,在本例中为HybridWebView。第二个类型参数应该是将实现自定义视图的本机控件。
    2. 重写OnElementChanged方法,该方法呈现自定义控件并编写逻辑以对其进行自定义。在创建相应的Xamarin.Forms自定义控件时调用此方法。
    3. 将ExportRenderer属性添加到自定义渲染器类,以指定它将用于呈现Xamarin.Forms自定义控件。此属性用于向Xamarin.Forms注册自定义渲染器。
    4. 开始使用本机控件的起点是OnElementChanged覆盖。

      protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e)
      {
        base.OnElementChanged (e);
      
        if (Control == null) {
          // Instantiate the native control and assign it to the Control property
        }
      
        if (e.OldElement != null) {
          // Unsubscribe from event handlers and cleanup any resources
        }
      
        if (e.NewElement != null) {
          // Configure the control and subscribe to event handlers
        }
      }