如何从Xamarin修改平台特定的属性.表单应用程序

本文关键字:属性 表单 应用程序 平台 Xamarin 修改 | 更新日期: 2023-09-27 18:13:51

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

public class MainPage : ContentPage
{
    private WebView webView;
    public MainPage()
    {
        Content = (webView = new WebView());
    }
}

WebView类在每个平台上的实现是不同的——每个平台都有自己的一组额外的属性。例如,在iOS上,WebView控件呈现为UIWebView控件,它具有额外的平台特定属性,其中一些不通过WebView类浮出水面。

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

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

如何从Xamarin修改平台特定的属性.表单应用程序

贴出答案帮助别人,因为我终于想通了。——看起来你需要实现一个自定义渲染器。

本质上,在特定于设备的项目中,您需要创建一个类来继承给定控件的默认呈现器(这里有一些表)。

不幸的是,对于更具体的控件,如WebView,您必须自己弄清楚。

最后,你必须添加一个组件属性来"导出"你的渲染器。

例如,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 s)。

要做到这一点,你需要在共享的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;
        }
    }
}

你需要创建一个自定义渲染器,或者使用Effects来设置平台特定的属性。