[英]Xamarin BindableProperty doesn`t call setter
我的自定义组件中的 Uri 属性有问题
我的自定义 WebView 组件:
public class PdfWebView : WebView
{
public static readonly BindableProperty UriProperty = BindableProperty.Create(nameof(Uri), typeof(string), typeof(PdfWebView), default(string), propertyChanged: OnUriPropertyChanged);
private static void OnUriPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
if(oldValue != newValue)
{
}
}
public string Uri
{
get { return (string)GetValue(UriProperty); }
set { SetValue(UriProperty, value); } // need call but it`s doesnt work
}
}
XAML:
<controls:PdfWebView
x:Name="PdfView"
Uri="{Binding Uri}"
IsVisible="{Binding IsLoaderVisible, Converter={StaticResource BoolReverseConverter}}"
Margin="0"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
Navigated="WebView_Navigated"/>
渲染器:
[assembly: ExportRenderer(typeof(PdfWebView), typeof(PdfWebViewRenderer))]
namespace Contrinex.Droid.Renderers
{
public class PdfWebViewRenderer : WebViewRenderer
{
public PdfWebViewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
Control.Settings.JavaScriptEnabled = true;
Control.Settings.AllowFileAccess = true;
Control.Settings.AllowFileAccessFromFileURLs = true;
Control.Settings.AllowUniversalAccessFromFileURLs = true;
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == PdfWebView.UriProperty.PropertyName)
{
var docView = Element as PdfWebView;
Control.LoadUrl($"file:///android_asset/pdfjs/web/viewer.html?file={($"file:///{docView.Uri.Trim('/')}")}");
}
}
}
}
Uri 属性中的值已更改,但 setter 不调用
根据您的描述,您的意思是您更改了 Uri 属性,但 PdfWebview 中的 BindableProperty UriProperty 不会更改。
如果是,请在 Rebder 中添加OnElementPropertyChanged方法,如下所示:
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
PdfWebView pdfWebView = sender as PdfWebView;
if (e.PropertyName == "Uri")
{
Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(pdfWebView.Uri))));
}
}
关于 webview 渲染的完整代码:
public class PdfWebViewRenderer: WebViewRenderer
{
public PdfWebViewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
var pdfView = Element as PdfWebView;
Control.Settings.AllowUniversalAccessFromFileURLs = true;
Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(pdfView.Uri))));
}
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
PdfWebView pdfWebView = sender as PdfWebView;
if (e.PropertyName == "Uri")
{
Control.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(pdfWebView.Uri))));
}
}
}
截图:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.