0

印刷したい 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

4

1 に答える 1

0

不足している可能性のある部分はMessageBox.Show();、UIElement を更新したことです

したがって、次のコードを使用して UIElement を手動で更新すれば十分です。

  ui.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));// activates ui.InvalidateMeasure(); 
  ui.Arrange(new Rect(new Point(0, 0), ui.DesiredSize));                 // activates ui.InvalidateArrange();

  ui.UpdateLayout(); // <-- refreshed your UIElement

これは少なくとも私の場合は機能します

補足:メジャーまたはアレンジを変更しない場合は、 AFAIKが更新されないため
、直接呼び出すべきではありません。ui.Invalidate...UpdateLayout()UIElement

于 2014-02-18T14:42:27.747 に答える