我有一个 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/