[英]How do you modify platform specific properties from a Xamarin.Forms application?
我有一个Xamarin.Forms
便携式应用程序,其中包含带有WebView
控件的Page
。
public class MainPage : ContentPage
{
private WebView webView;
public MainPage()
{
Content = (webView = new WebView());
}
}
WebView
类在每个平台上的实现方式有所不同-每个平台都有自己的一组额外属性。 例如,在iOS上, WebView控件呈现为UIWebView
控件 ,该控件具有特定于平台的其他属性 ,其中某些属性不会通过WebView
类浮出水面。
当我的应用程序在iOS上运行时,我想在特定的WebView
控件上设置其中一些属性。 (同样,我也想对Android和UWP项目以及与其他非WebView的Xamarin.Forms控件进行相同的操作。)
那么,如何在Xamarin.Forms中设置这些平台特定控件的属性?
发布答案以帮助他人,因为我终于弄清楚了。 –看来您需要实现自定义渲染器 。
本质上,在设备特定的项目中,您需要创建一个类,该类继承给定控件的默认渲染器(此处有一些表 。
不幸的是,对于像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;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.