需要使用路由结果打印UWP MapControl

时间:2016-05-30 23:06:00

标签: printing routes uwp

我有一个MapControl正在创建我的路线。现在,我只需要找出一种打印出来的方法。使用UWP打印样本,我得到一个控件应该是黑盒子。正在构建地图和路线,但在打印预览中无法正确渲染。我以为我看到了MapControl.Print ...但我认为那是在Bing.Maps的东西。任何指针将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

  

使用UWP打印样本,我得到一个控件应该是黑框。

似乎无法打印MapControl。

作为workround,我们可以使用RenderTargetBitmapMapControl获取图片。我们可以打印图像。

  

使用RenderTargetBitmap,您可以完成一些场景,例如将图像效果应用于最初来自XAML UI合成的视觉效果,生成导航系统子页面的缩略图图像,或者允许用户将部分UI保存为一个图像源,然后与其他应用程序共享该图像。

     

因为RenderTargetBitmap是ImageSource的子类,所以它可以用作Image元素或ImageBrush画笔的图像源。

有关详细信息,请参阅RenderTargetBitmap

例如:

RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(MyMap);
MyImage.Source = renderTargetBitmap;

打印代码:

public sealed partial class MainPage : Page
{
    private PrintManager printmgr = PrintManager.GetForCurrentView();
    private PrintDocument printDoc = null;
    private PrintTask task = null;

    public MainPage()
    {
        this.InitializeComponent();

        printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
    }

    private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
    {
        var deferral = args.Request.GetDeferral();

        task = args.Request.CreatePrintTask("Print", OnPrintTaskSourceRequrested);
        task.Completed += PrintTask_Completed;
        deferral.Complete();
    }

    private void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
    {
        //the PrintTask is completed
    }

    private async void OnPrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args)
    {
        var def = args.GetDeferral();
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
          () =>
          {
              args.SetSource(printDoc?.DocumentSource);
          });
        def.Complete();
    }

    private async void appbar_Printer_Click(object sender, RoutedEventArgs e)
    {
        if (printDoc != null)
        {
            printDoc.GetPreviewPage -= OnGetPreviewPage;
            printDoc.Paginate -= PrintDic_Paginate;
            printDoc.AddPages -= PrintDic_AddPages;
        }
        this.printDoc = new PrintDocument();

        printDoc.GetPreviewPage += OnGetPreviewPage;

        printDoc.Paginate += PrintDic_Paginate;

        printDoc.AddPages += PrintDic_AddPages;

        bool showPrint = await PrintManager.ShowPrintUIAsync();
    }

    private void PrintDic_AddPages(object sender, AddPagesEventArgs e)
    {
        printDoc.AddPage(this);

        printDoc.AddPagesComplete();
    }

    private void PrintDic_Paginate(object sender, PaginateEventArgs e)
    {
        PrintTaskOptions opt = task.Options;

        printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
    }

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