【问题标题】:Call UWP service on Shared project在共享项目上调用 UWP 服务
【发布时间】:2021-06-14 08:17:27
【问题描述】:

我有一个 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 项目不能调用服务吗?问候

【问题讨论】:

  • 是共享项目中定义的接口吗?您是否阅读过使用 DependencyService 的文档和示例?
  • 否,共享项目中没有定义,如何定义?你能和我分享一下那个文件吗? @杰森
  • 字面移动共享项目中的接口文件。这些文档是 Google 上的第一击 - docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/…
  • 太棒了,谢谢! @杰森

标签: xamarin uwp


【解决方案1】:

在共享项目上调用 UWP DependencyService

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

note,在每个平台项目中实现接口后,平台实现必须注册到DependencyService,以便Xamarin.Forms 可以在运行时定位它们。像下面这样使用DependencyAttribute

[assembly: Dependency(typeof(UWP Client namesapce))]

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 2013-02-25
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多