在共享项目上调用 UWP 服务

时间:2021-03-17 00:53:34

标签: xamarin uwp

我有一个 Xamarin 应用程序,我在其中实现了一项打印服务。我在 UWP 应用上创建该服务,因为它需要它的一些依赖项。

UWP 服务:

 public class PrintUWPService
    {
        PrintManager printmgr = PrintManager.GetForCurrentView();
        PrintDocument PrintDoc;
        PrintDocument printDoc;
        PrintTask Task;
        private Windows.UI.Xaml.Controls.WebView ViewToPrint = new Windows.UI.Xaml.Controls.WebView();

        public PrintUWPService()
        {
            printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
        }

        public async void Print(WebView viewToPrint, string htmlSource)
        {
            ViewToPrint.NavigateToString(htmlSource);

            if (PrintDoc != null)
            {
                printDoc.GetPreviewPage -= PrintDoc_GetPreviewPage;
                printDoc.Paginate -= PrintDoc_Paginate;
                printDoc.AddPages -= PrintDoc_AddPages;
            }

            printDoc = new PrintDocument();

            try
            {
                printDoc.GetPreviewPage += PrintDoc_GetPreviewPage;
                printDoc.Paginate += PrintDoc_Paginate;
                printDoc.AddPages += PrintDoc_AddPages;

                var showprint = await PrintManager.ShowPrintUIAsync();

            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
            }

            PrintDoc = null;
            GC.Collect();
        }

        private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
        {
            var deff = args.Request.GetDeferral();
            Task = args.Request.CreatePrintTask("Grocery List", OnPrintTaskSourceRequested);

            deff.Complete();

        }
        async void OnPrintTaskSourceRequested(PrintTaskSourceRequestedArgs args)
        {
            var def = args.GetDeferral();
            await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                args.SetSource(printDoc.DocumentSource);
            });
            def.Complete();
        }

        private void PrintDoc_AddPages(object sender, AddPagesEventArgs e)
        {
            printDoc.AddPage(ViewToPrint);
            printDoc.AddPagesComplete();
        }

        private void PrintDoc_Paginate(object sender, PaginateEventArgs e)
        {
            PrintTaskOptions opt = Task.Options;
            printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
        }

        private void PrintDoc_GetPreviewPage(object sender, GetPreviewPageEventArgs e)
        {
            printDoc.SetPreviewPage(e.PageNumber, ViewToPrint);
        }
    }
}

然后我为它创建界面:

 public interface IPrintUWPService
    {
        void Print(WebView viewToPrint, string htmlSource);
    }

现在在我共享项目的一个类中,我想将此服务称为:

private readonly IPrintUWPService _printService =  DependencyService.Get<IPrintUWPService>();

但它不起作用。它说:

<块引用>

IPrintUWPService 在当前上下文中不存在

所以我尝试访问 UWP 类:

using MyCompany.ProjectName.App.UWP

但它说“UWP”命名空间不存在。我究竟做错了什么?共享项目中的 UWP 项目无法调用服务?问候

1 个答案:

答案 0 :(得分:0)

<块引用>

在共享项目上调用 UWP DependencyService

正如@Jason 在上面的评论中提到的,您需要在 Xamarin Forms 项目中声明接口并在 UWP 客户端项目中实现它。

并且请note,在每个平台项目中实现接口后,平台实现必须注册到DependencyService,以便Xamarin.Forms 可以在运行时定位它们。使用 DependencyAttribute 如下所示。

[assembly: Dependency(typeof(UWP Client namesapce))]
相关问题