首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印预览UWP

打印预览UWP
EN

Stack Overflow用户
提问于 2018-04-01 16:35:18
回答 1查看 853关注 0票数 1

我创造了一个用文字和图像打印的工作表.唯一的问题是,如果我第一次启动打印界面,图像不会出现在打印预览中.这样我就能在预览中看到图像了吗?

MainPage.xaml:

代码语言:javascript
复制
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Button x:Name="btnPrint" Click="btnPrint_Click" Content="Print" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Center"/>
</Grid>

MainPage.xaml.cs:

代码语言:javascript
复制
public sealed partial class MainPage : Page
{
    PrintManager printmgr = PrintManager.GetForCurrentView();
    PrintDocument printDoc = null;
    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);
        PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(task.Options);
        deferral.Complete();
    }

    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 void PrintDic_AddPages(object sender, AddPagesEventArgs e)
    {
        printDoc.AddPage(new PageToPrint());
        printDoc.AddPagesComplete();
    }
    private void PrintDic_Paginate(object sender, PaginateEventArgs e)
    {
        PrintTaskOptions opt = task.Options;
        PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(e.PrintTaskOptions);
        printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
    }
    private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
    {
        Page page = new PageToPrint();
        Grid printableArea = (Grid)page.FindName("PrintArea");
        printDoc.SetPreviewPage(e.PageNumber, printableArea);
    }

    private async void btnPrint_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();
    }
}

PageToPrint.xaml:

代码语言:javascript
复制
<ScrollViewer>
    <Grid x:Name="PrintArea">
        <TextBlock Text="This is the text" FontSize="80"/>
        <Image Source="Image/4.JPG"/>
    </Grid>
</ScrollViewer>

谢谢你帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-03 08:54:57

当打印预览窗口显示时,图像似乎没有被初始化或加载。您可以尝试以下方式在预览窗口中查看图像显示。

首先,在Canvas中添加一个MainPage.xaml控件,使其Opacity="0"不能在MainPage中看到,

代码语言:javascript
复制
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Canvas Name="MyCanvas" Opacity="0"/>
    <Button x:Name="btnPrint" Click="btnPrint_Click" Content="Print" HorizontalAlignment="Center" Margin="0,0,0,0" VerticalAlignment="Center"/>
</Grid>

然后,添加一个PreparePrintContent方法并在btnPrint_Click事件中的PrintManager.ShowPrintUIAsync之前调用它,代码如下所示,

代码语言:javascript
复制
private async void btnPrint_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;

    PreparePrintContent(new PageToPrint());

    bool showPrint = await PrintManager.ShowPrintUIAsync();
}

private void PreparePrintContent(Page pageToPrint)
{
    var canvas=(Canvas)this.FindName("MyCanvas");
    canvas.Children.Clear();
    canvas.Children.Add(pageToPrint);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49600241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档