web-dev-qa-db-ja.com

UWPアプリで印刷する方法は?

UWPアプリから何かを印刷しようとしています。基本的に、WebViewBrushを使用していくつかのデータをいくつかのFrameworkElement(Windows.UI.Xaml.Shapes.Rectangle)に描画しました-そして、これらの長方形の1つを各ページに印刷したいと思います(ページごとに1つの長方形)

UWPでの印刷がどのように機能するかについて、非常に簡単な例を誰かが提供してくれることを本当に望んでいました。私は自分で試してみましたが、コードを提供できてうれしいですが、正直なところ数千行あります。これらはすべて、Microsoft GitHubの例から抜粋して、微調整を試みました。

正直なところ、これらの例は複雑すぎると思います。私が欲しいのは、本当に簡単な印刷方法です。このトピックに関するチュートリアルも見つかりませんが、誰かが私が動作する可能性のある小さなコードスニペットを持っている場合は、それを基に構築して、(現在行っていることではなく、Rectanglesで動作するようにすることができます)マイクロソフトからの巨大な例であり、私が必要としない部分を見つけようとしています)。

ありがとうございました。この質問に簡単に答えることができる人なら誰でも、これが将来の決定的な参照点になると思います-このトピックに関するオンライン情報は非常に少ないためです。

11
b85411

UWPアプリで印刷する方法については、 アプリから印刷 の手順に従ってください。また、GitHubの Printing sample も参照してください。以下は、ページに長方形を印刷する方法を示す簡単なサンプルです。

XAMLで、印刷ボタンと印刷する長方形を追加します。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Button HorizontalAlignment="Center" Click="PrintButtonClick">Print</Button>
    <Rectangle x:Name="RectangleToPrint"
               Grid.Row="1"
               Width="500"
               Height="500">
        <Rectangle.Fill>
            <ImageBrush ImageSource="Assets/img.jpg" />
        </Rectangle.Fill>
    </Rectangle>
</Grid>

そして、コードビハインドでは、印刷ロジックを処理します。

public sealed partial class MainPage : Page
{
    private PrintManager printMan;
    private PrintDocument printDoc;
    private IPrintDocumentSource printDocSource;

    public MainPage()
    {
        this.InitializeComponent();
    }

    #region Register for printing

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        // Register for PrintTaskRequested event
        printMan = PrintManager.GetForCurrentView();
        printMan.PrintTaskRequested += PrintTaskRequested;

        // Build a PrintDocument and register for callbacks
        printDoc = new PrintDocument();
        printDocSource = printDoc.DocumentSource;
        printDoc.Paginate += Paginate;
        printDoc.GetPreviewPage += GetPreviewPage;
        printDoc.AddPages += AddPages;
    }

    #endregion

    #region Showing the print dialog

    private async void PrintButtonClick(object sender, RoutedEventArgs e)
    {
        if (PrintManager.IsSupported())
        {
            try
            {
                // Show print UI
                await PrintManager.ShowPrintUIAsync();
            }
            catch
            {
                // Printing cannot proceed at this time
                ContentDialog noPrintingDialog = new ContentDialog()
                {
                    Title = "Printing error",
                    Content = "\nSorry, printing can' t proceed at this time.",
                    PrimaryButtonText = "OK"
                };
                await noPrintingDialog.ShowAsync();
            }
        }
        else
        {
            // Printing is not supported on this device
            ContentDialog noPrintingDialog = new ContentDialog()
            {
                Title = "Printing not supported",
                Content = "\nSorry, printing is not supported on this device.",
                PrimaryButtonText = "OK"
            };
            await noPrintingDialog.ShowAsync();
        }
    }

    private void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
    {
        // Create the PrintTask.
        // Defines the title and delegate for PrintTaskSourceRequested
        var printTask = args.Request.CreatePrintTask("Print", PrintTaskSourceRequrested);

        // Handle PrintTask.Completed to catch failed print jobs
        printTask.Completed += PrintTaskCompleted;
    }

    private void PrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args)
    {
        // Set the document source.
        args.SetSource(printDocSource);
    }

    #endregion

    #region Print preview

    private void Paginate(object sender, PaginateEventArgs e)
    {
        // As I only want to print one Rectangle, so I set the count to 1
        printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
    }

    private void GetPreviewPage(object sender, GetPreviewPageEventArgs e)
    {
        // Provide a UIElement as the print preview.
        printDoc.SetPreviewPage(e.PageNumber, this.RectangleToPrint);
    }

    #endregion

    #region Add pages to send to the printer

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

        // Indicate that all of the print pages have been provided
        printDoc.AddPagesComplete();
    }

    #endregion

    #region Print task completed

    private async void PrintTaskCompleted(PrintTask sender, PrintTaskCompletedEventArgs args)
    {
        // Notify the user when the print operation fails.
        if (args.Completion == PrintTaskCompletion.Failed)
        {
            await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
            {
                ContentDialog noPrintingDialog = new ContentDialog()
                {
                    Title = "Printing error",
                    Content = "\nSorry, failed to print.",
                    PrimaryButtonText = "OK"
                };
                await noPrintingDialog.ShowAsync();
            });
        }
    }

    #endregion
}
19
Jay Zuo

私もこれに苦労してきました。 SDKの例を何度も繰り返しました。この解決策はあなたに役立つかもしれません。印刷したいものをRichTextBoxに入れる方法がある場合は、プログラムでその段落を作成できます。また、SDKの例のRichTextBoxを、グリッド要件をレイアウトした空白のStackPanelに置き換えると、問題が解決します。私は2列の食料品リストを作成することでそれを行ったので、私の問題はまったく同じではありませんでした。秘訣は、私の例では、固定幅フォントのCourierNewを使用することでした。

印刷ライブラリを呼び出すページでは、これをXAMLに含める必要があります

<Canvas x:Name="PrintCanvas" Opacity="0"/>

PageToPrintの代わりとなるページでは、コンストラクターでこのようなものを直接ビルドできます。コレクションをページのインスタンス化に渡し、PageToPrintの代わりに次のようにレイアウトを計算します、、、

   private void MakeThePrintOut()
    {


        RichTextBlock gutOne = initBlock();
        PopulateBlock(gutOne);
        ContentStack.Children.Add(gutOne);


    }
    private RichTextBlock initBlock()
    {

        RichTextBlock gutInitBlock = new RichTextBlock();
        gutInitBlock.Foreground = new SolidColorBrush(Windows.UI.Colors.Black);
        gutInitBlock.FontSize = 18;
        gutInitBlock.OverflowContentTarget = FirstLinkedContainer;
        gutInitBlock.FontFamily = new FontFamily("Courier New");
        gutInitBlock.VerticalAlignment = VerticalAlignment.Top;
        gutInitBlock.HorizontalAlignment = HorizontalAlignment.Left;
        return gutInitBlock;

    }
    private void PopulateBlock( RichTextBlock Blocker)
    {


        bool firstItem = true;
        int firstLength = 0;
        Paragraph paraItem = null;
        Run itemRun = null;

        string CurrentIsle = "None";

        foreach( Grocery j in Grocs)
        {
            if (j.Isle != CurrentIsle)
            {
                if ((CurrentIsle != "None") && (!firstItem))
                {
                    paraItem.Inlines.Add(itemRun);
                    Blocker.Blocks.Add(paraItem);

                }
                CurrentIsle = j.Isle;
                firstItem = true;
                Paragraph paraIsle = new Paragraph();
                Run paraRan = new Run();
                paraRan.Text = "     " + j.Isle;
                paraIsle.Inlines.Add(paraRan);
                Blocker.Blocks.Add(paraIsle);


            }
           if (firstItem)
            {
                paraItem = new Paragraph();
                itemRun = new Run();
                itemRun.Text = "        [] " + j.Item;
                firstLength = j.Item.Length;
                firstItem = false;
            } else
            {
                firstItem = true;
                string s = new string(' ', 30 - firstLength);
                itemRun.Text += s + "[] " +  j.Item;
                paraItem.Inlines.Add(itemRun);
                Blocker.Blocks.Add(paraItem);

            }





            }
        if (!firstItem)
        {
            paraItem.Inlines.Add(itemRun);
            Blocker.Blocks.Add(paraItem);
        }
    }

それはあなたが探しているものではありませんが、印刷の質問に答えるのに意味のあるものを見つけるのがどれほど難しいかは知っています。完全な例を見たい場合は、GitHub.com/Gibbloggenにあります。GutenbergOneプロジェクトは、私がこのようなものを開発した私のプロトタイピングでした。また、メインプロジェクトのEssentialGrocerにもインポートしました。これも、同じ場所にあるオープンソースです。それはちょうど今夜、買い物リストの印刷を含みます。

これのいくつかが役立つことを願っています、私はこれにも本当に苦労しました。

1
John Leone