2017-07-13 23 views
0

今日私はWPFで作業しています!最後の機能を除いて、私のアプリはほぼ終了しています。私は、スーパーマーケットの棚の商品の下で見ることができるもののようなラベルを表すグラフィック要素を作成しました。それらのうちの1つは、PrintDialog.PrintVisual(myVisualItem,"description");を使用して簡単に印刷できます。 ここでは、一連のPintVisual()をループで使用して、別々のドキュメントにすべての要素を印刷する一連のラベルを印刷する必要があります。視覚的なアイテムのIEnumerableを受け入れるPrintVisual()のオーバーロードはありません。私はこれらの要素を改ページする必要があることをオンラインで見てきましたが、私はそれを行う方法を見つけることができません何ができますか?ありがとう!複数のキャンバスWPFを印刷しますか?

+0

解決策の1つが問題を解決した場合は、解決済みとマークしてください。そうでない場合は、既存の回答にまだ見つからないものを明確にしてください。 – Iqon

答えて

1

あなたが持っているすべてのキャンバスを1つの大きなキャンバスにまとめてから、このキャンバスを印刷することができます。ここで

は一つの大きな一つに複数のキャンバスをCONCATする方法をいくつかのサンプルコードです:

public Canvas CombineCanvases(params Canvas[] canvases) 
{ 
    // Force each canvas to update its desired size 
    foreach (var canvas in canvases) { canvas.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); } 

    var result = new Canvas 
    { 
     Height = canvases.Sum(x => x.DesiredSize.Height), // add all heights to get needed height 
     Width = canvases.Max(x => x.DesiredSize.Width) // find required width 
    }; 

    var pos = 0d; 
    foreach (var canvas in canvases) 
    { 
     Canvas.SetLeft(canvas, 0); 
     Canvas.SetTop(canvas, pos); // position element at this pixel count 
     pos += canvas.DesiredSize.Height; // and increment it 

     result.Children.Add(canvas); 
    } 

    return result; 
} 

あなたは結果を印刷し、印刷したいすべてのキャンバスのを渡す必要があります。

var c1 = new Canvas 
{ 
    Width = 100, 
    Height = 100, 
    Children = { new TextBlock { Text = "Canvas 1" } } 
}; 
var c2 = new Canvas 
{ 
    Width = 100, 
    Height = 100, 
    Children = { new TextBlock { Text = "Canvas 2" } } 
}; 

var canvas = CombineCanvases(c1, c2); 
// print canvas here 

あなたは1ページに収まると、その後に大きなものにすべてのキャンバスをCONCATないが、ちょうど1ページを埋めるために必要な限り多くを取るどのように多くのラベルをチェックするとページネーションは次のようになります。

このページを印刷し、すべてラベルが印刷されるまでこれを繰り返します。これはページ番号と呼ばれます。

+0

ご協力いただきありがとうございます。理解に非常に役に立ちました!おそらく私は自分自身を悪く表現しています。私たちが使っているプリンタは、すでに適切なフォーマットでラベルを印刷するように設定されているので、正しいページの寸法を設定して、すべてのラベルをページに入れてください。 –

+0

私はラベルを変更しません(c1とc2はあなたのラベルです)。コードスニペットは1つの大きなキャンバスにそれらを配置し、それを印刷することができます。これにより、 '' 'PrintVisual'''を1回呼び出すだけで、1つのページに複数のラベルを印刷することができます – Iqon

0

もしそれらがすべて1ページに収まると思えば、Orientation = VerticalのStackPanelにそれらを入れることができます。スタックパネルを印刷します。

var panel = new StackPanel() { Orientation = Orientation.Vertical }; 
panel.Children.Add(canvas1); 
panel.Children.Add(canvas2); 
panel.UpdateLayout(); 
var dlg = new PrintDialog(); 
dlg.PrintVisual(panel, "description"); 
関連する問題