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

标签 c# android ios xamarin.forms uwp

我有一个 Xamarin.Forms 可移植应用程序,其中包含一个带有 WebView 控件的 Page

public class MainPage : ContentPage
{
    private WebView webView;

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

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

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

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

最佳答案

发布一个答案来帮助别人,因为我终于弄明白了。 -- 看起来你需要实现一个 Custom Renderer .

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

不幸的是,对于像 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(类似于 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;
        }
    }
}

关于c# - 如何从 Xamarin.Forms 应用程序修改平台特定属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118132/

相关文章:

Android - 将数据从 Activity 发送到服务

ios - UIWebView 加载的 URL 与移动版 Safari 不同吗?

c# - C# 泛型集合中的倒排索引

c# - 如何使用MVC路由处理IIS子应用程序?

android - 更改 Flutter Snackbar 的位置

ios - 使 getNotificationSettings 返回而不是使用完成 block

ios - TestFlight 后 iCloud 无法工作

c# - 从文件夹中删除文件的单元测试方法

c# - 通过 Microsoft.Graph 邀请用户会出现错误

android - 开发时在 Android watch 上安装 apk 的最佳方法是什么?