如何从Xamarin修改平台特定的属性.表单应用程序
本文关键字:属性 表单 应用程序 平台 Xamarin 修改 | 更新日期: 2023-09-27 18:13:51
我有一个Xamarin.Forms
便携式应用程序,其中包含一个Page
与WebView
控件。
public class MainPage : ContentPage
{
private WebView webView;
public MainPage()
{
Content = (webView = new WebView());
}
}
WebView
类在每个平台上的实现是不同的——每个平台都有自己的一组额外的属性。例如,在iOS上,WebView控件呈现为UIWebView
控件,它具有额外的平台特定属性,其中一些不通过WebView
类浮出水面。
当我的应用程序在iOS上运行时,我想在特定的WebView
控件上设置一些这些属性。(同样,我也想为Android和UWP项目做同样的事情;以及其他Xamarin。(不是webview的窗体控件)
贴出答案帮助别人,因为我终于想通了。——看起来你需要实现一个自定义渲染器。
本质上,在特定于设备的项目中,您需要创建一个类来继承给定控件的默认呈现器(这里有一些表)。
不幸的是,对于更具体的控件,如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
s(类似于WPF中的DependencyProperty
s)。
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;
}
}
}
你需要创建一个自定义渲染器,或者使用Effects来设置平台特定的属性。