印刷したい WPF データ入力画面/ウィンドウがあります。(正確には、印刷したいTabControlのTabItemとして機能するように装備したUserControlです。)
きれいに印刷するには、いくつかのレイアウト変換を行い、ウィンドウを用紙サイズに合わせて拡大縮小し、アプリケーションのスキンを変更します。「印刷スキン」は、背景を白に変更し、ヘッダー ラベルなどの背景を削除します。
これは完全に機能しました-MessageBox.Show()
何が起こっているのかを教えてくれるプロンプトがありました.
しかし、Messagebox.Show プロンプトを取り出したところ、すべての印刷マジックが機能していないことがわかりました。それは、あたかも完全な印刷方法がPrintVisual();
UserControl で行われたかのようでした。(私はこれを、何かを壊さないと取り除くことができない 1 つの MessageBox に絞り込みました。)
コード (長くてすみません。コメントをまとめて追加しました):
private void PrintStatements()
{
PrintDialog print = new PrintDialog();
/// Needed data
PrintCapabilities capabilities = print.PrintQueue.GetPrintCapabilities(print.PrintTicket);
double pageMargin = 1 / 2.54; // 1cm
double pageWidth = capabilities.PageImageableArea.ExtentWidth - (pageMargin);
double pageLength = capabilities.PageImageableArea.ExtentHeight - (pageMargin);
Size pageSize = new Size(pageWidth, pageLength);
ResourceDictionary resources = new ResourceDictionary();
bool canPrint = print.ShowDialog() ?? false;
if (canPrint)
{
double tabWidth = StatementsTabCtrl.ActualWidth;
double tabHeight = StatementsTabCtrl.ActualHeight;
/// 1. Get tab item content ('currentTabContent')
StatementsTabItem currentTabContent = StatementsTabCtrl.SelectedContent as StatementsTabItem;
/// 2. Get Original Specs of currentTabContent
ResourceDictionary origSkin = Application.Current.Resources;
Size origSize = new Size(currentTabContent.ActualWidth, currentTabContent.ActualHeight);
Transform origTransform = currentTabContent.LayoutTransform;
/// 3. Transform currentTabContent (expose print panels, move stuff around etc) -
//do this inside TabItem class
currentTabContent.SetupPrinting();
/// 4. Make changes outside TabItem (skin, page-scale)
// skin
resources.MergedDictionaries.Add(Application.LoadComponent(new Uri(@"Skin/PrintDictionary.xaml", UriKind.Relative)) as ResourceDictionary);
Application.Current.Resources = resources;
// page-scale
double scale = Math.Min(pageWidth / currentTabContent.ActualWidth,
pageLength / currentTabContent.ActualHeight);
// ****Uncomment next line - printing magic works.**** //
// MessageBox.Show(string.Format("scaling by {0}", scale));
System.Threading.Thread.Sleep(250);
currentTabContent.LayoutTransform = new ScaleTransform(scale, scale);
//Measure and Arrange
currentTabContent.Measure(pageSize);
((UIElement)currentTabContent).Arrange(new Rect(
new Point((capabilities.PageImageableArea.OriginWidth + pageMargin),
(capabilities.PageImageableArea.OriginHeight + pageMargin)), pageSize));
System.Threading.Thread.Sleep(250);
/// 5. Print (Finally!)
print.PrintVisual(currentTabContent, "Print Results");
/// 6. Return everything to normal (undo 3, then 4)
// undo 3.
currentTabContent.TearDownPrinting();
// undo 4.
Application.Current.Resources = origSkin;
scale = Math.Max(currentTabContent.ActualWidth / pageWidth,
currentTabContent.ActualHeight / pageLength);
currentTabContent.LayoutTransform = new ScaleTransform(1 / scale, 1 / scale);
currentTabContent.Measure(origSize);
((UIElement)currentTabContent).Arrange(new Rect(0, 0, tabWidth, tabHeight));
}
}
ご覧のとおりSystem.Threading.Thread.Sleep(250);
、変更を認識するのにさらに時間がかかる場合に備えて、いくつか追加してみましたが、効果がありません。呼び出しの奇妙さPrintDialog()
は、同様の理由によるものです。通常の方法で呼び出しても違いはありません。
MessageBox 呼び出しがないと印刷機能が動作しない理由を誰か教えてもらえますか、または MessageBox 呼び出しをシミュレートしてプログラムをブラフして動作させる方法を教えてもらえますか? たくさん、たくさんのTIA