我有一个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中设置这些平台特定控件的属性?
答案 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设置平台特定属性。