如何从Xamarin.Forms应用程序修改平台特定属性?

时间:2016-10-18 21:11:43

标签: c# android ios xamarin.forms uwp

我有一个Xamarin.Forms便携式应用程序,其中包含一个Page,其上有一个WebView控件。

public class MainPage : ContentPage
{
    private WebView webView;

    public MainPage()
    {
        Content = (webView = new WebView());
    }
}

WebView类在每个平台上的实现方式不同 - 每个平台都有自己的一组额外属性。例如,在the WebView control is rendered as a UIWebView control的iOS上,additional platform specific properties,其中一些不会通过WebView类浮出水面。

当我的应用在iOS上运行时,我想在特定WebView控件上设置其中一些属性。 (同样,我也想为Android和UWP项目做同样的事情;以及其他不是WebView的Xamarin.Forms控件。)

那么,如何在Xamarin.Forms中设置这些平台特定控件的属性?

2 个答案:

答案 0 :(得分:2)

发布帮助他人的答案,因为我终于明白了。 - 您似乎需要实施Custom Renderer

基本上,在特定于设备的项目中,您需要创建一个继承给定控​​件的默认渲染器的类(有some tables here

不幸的是,对于像WebView这样的更具体的控件,您必须自己解决这个问题。

最后,你必须将一个汇编属性添加到" export"你的渲染器。

例如,iOS项目中的类可能如下所示:

using My.Project.iOS.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(WebView), typeof(CustomWebViewRenderer))]

namespace My.Project.iOS.Renderers
{
    internal class CustomWebViewRenderer : Xamarin.Forms.Platform.iOS.WebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            var view = NativeView as UIKit.UIWebView;

            if (view != null)
            {    
                view.ScrollView.ScrollEnabled = false;
                view.ScrollView.Bounces = false;
            }
        }
    }
}

注意:此渲染器现在将应用于iOS上呈现的所有WebView控件。因此,如果您只想将其应用于特定的,您需要一种方法来向自定义渲染器表示要应用其他设置的那些;我发现这样做的最简单方法是使用BindableProperty s(类似于WPF中的DependencyProperty)。

为此,您可以在共享PCL项目中的某处声明BindableProperty,如下所示:

namespace My.Project
{
    public static class Properties
    {
        public static readonly BindableProperty EnableScrollingProperty = BindableProperty.Create
        (
            "EnableScrolling",
            typeof(bool),
            typeof(WebView),
            true
        );
    }
}

您可以通过以下方式在WebView对象上进行设置:

webView.SetValue(My.Project.Properties.EnableScrollingProperty, false);

可以修改渲染器的OnElementChanged方法以获取该属性的值并检查它:

protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
    base.OnElementChanged(e);

    var enableScrolling = e?.NewElement?.GetValue(Properties.EnableScrollingProperty) as bool?;

    if (enableScrolling.HasValue)
    {
        var view = NativeView as UIKit.UIWebView;
        if (view != null)
        {
            view.ScrollView.ScrollEnabled = enableScrolling.Value;
            view.ScrollView.Bounces = enableScrolling.Value;
        }
    }
}

答案 1 :(得分:1)

您需要创建fs,或使用custom renderer设置平台特定属性。