发布答案以帮助他人,因为我终于想通了。 -- 看来你需要实现一个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 控件。因此,如果您只想将其应用于特定的,您将需要一种方法来向自定义渲染器指示哪些应用附加设置;我发现最简单的方法是使用 BindablePropertys(类似于 WPF 中的 DependencyPropertys)。
为此,您需要在共享 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;
}
}
}