xamarin 为单个平台创建缺少的自定义渲染器

gwbalxhn  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(145)

我需要从某个库使用PdfViewer。此库提供了Android,IOS,UWP平台的控制,但不适用于WPF平台。如何创建一个渲染器只为WPF平台?
WPF渲染器:

[assembly: ExportRenderer(typeof(PdfViewer), typeof(PdfViewerRenderer))]
public class PdfViewerRenderer : Xamarin.Forms.Platform.WPF.ViewRenderer<PdfViewer, WPF.PlatformImplementations.PdfViewer>
{

}

字符串
WPF控件实现:

namespace WPF.PlatformImplementations
{ 
    public class PdfViewer 
    { 
     //custom implementation of pdf viewer for wpf
    } 
}


Net标准库包含PdfViewer,它从库中的SfPdfViewer派生:

namespace Views
{ 
    public class PdfViewer : SfPdfViewer 
    { 
     //implementation of pdf viewer using base class from multiplatform library
    } 
}


上述方法不适用于WPF,适用于其他平台。当我将继承从SfPdfViewer更改为Xamarin.forms.View时,它适用于WPF,但显然不适用于其他平台。因此,问题是使渲染器机制将Views.PdfViewer识别为基于Xamarin.Forms.View的控件。

5f0d552i

5f0d552i1#

每个Xamarin.Forms控件都有一个随附的渲染器,用于每个需要创建本机控件示例的平台。
SfPdfViewer是一个xamarin-forms控件,它只表示共享的UI状态和交互逻辑。它需要一个相应的本地控件来实际呈现视图并与WPF平台交互。
为了做到这一点,第一步是选择一个基于WPF的控件来查看PDF文件。在这个例子中,我使用了WPF Pdf Viewer by SyncFusion;但是任何其他选项-可能像嵌入式WebView或像PdfiumViewer这样的开源选项也应该工作。

第一步:

在WPF项目中安装Syncfusion.PdfViewer.WPF的nuget包

第二步:

使用平台渲染器将forms-element(SfPdfViewer)与本机控件(PdfViewerControl)连接起来。

[assembly: ExportRenderer(typeof(SfPdfViewer), typeof(SfPdfViewerRenderer))]
namespace PdfViewer.Demo.WPF
{
    public class SfPdfViewerRenderer
        : ViewRenderer<SfPdfViewer, Syncfusion.Windows.PdfViewer.PdfViewerControl>
    {
        Syncfusion.Windows.PdfViewer.PdfViewerControl _nativeControl;

        protected override void OnElementChanged(ElementChangedEventArgs<SfPdfViewer> e)
        {
            base.OnElementChanged(e);

            // If new forms element attached, wire up the native control
            if (e.NewElement != null)
            {
                _nativeControl = new Syncfusion.Windows.PdfViewer.PdfViewerControl();
                SetNativeControl(_nativeControl);
            }
            // Otherwise perform some cleanup
            else
            {
                if(_nativeControl != null)
                {
                    _nativeControl.Unload();
                    _nativeControl = null;
                }
            }

            UpdateNativeControlProperties();
        }

        /// <summary>
        /// Basically sync property values from forms-element (SfPdfViewer) 
        /// to native-control (PdfViewerControl)
        /// In this example - we only sync with 'input file stream'
        /// </summary>
        private void UpdateNativeControlProperties()
        {
            if (Element != null && Element.InputFileStream != null)
            {
                Control.Load(Element.InputFileStream);
            }
            else
            {
                Control.Unload();
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == nameof(SfPdfViewer.InputFileStream))
            {
                UpdateNativeControlProperties();
            }
        }
    }
}

字符串

参考Github上传的示例工程。

x1c 0d1x的数据

ny6fqffe

ny6fqffe2#

一种方法是在Core项目中创建一个CustomPdfViewer接口,并使用依赖注入在每个本机项目中单独实现。
在每个iOS、Android和UWP项目的原生实现中,只需使用适合您的PdfViewer库即可。
然后对于WPF,只需使用SfPdfViewer即可。
例如:您可以通过示例查看DependencyService上的official documentation here
一旦你这样做了,你就会有你的解决方案。但是如果你想更进一步,访问你在XAML中创建的CustomPdfViewer,你可以使用“XAML Markup Extensions”,由术语local表示,就像你在here例子中看到的那样。

相关问题