2013-03-01 46 views
1

我目前對以下問題有點困擾。我有一個基本顯示圖形的用戶界面(由線條,圓圈組成的畫布......這些都是WPF對象)。根據用戶在菜單中所做的選擇,有些項目會被刪除,有些會被添加。所以基本的圖像看起來一樣,但做了一些修改。WPF從單個視圖模型打印多個頁面

用戶可以通過單擊下一個/上一個按鈕來選擇 - 說 - 10個不同的「頁面」。

我正在使用MVVM Light,我的ViewModel包含圖形(所有行,...)的所有項目。

現在我想將該圖形打印到多個頁面。第一頁應該包含第一頁更改的圖形,第二頁包含第二頁更改的圖形等等。實際頁數是動態的。我用一個屬性CurrentPage和一個屬性PagesTotal跟蹤這個。 每當我按下「下一步」按鈕,這將導致執行命令將更改變量CurrentPage,並確保顯示正確的項目。

現在我想打印這個,但這是我卡住的地方。我不介意離開MVVM區域,在代碼隱藏方面做一些骯髒的工作,但我會拒絕像以前的GDI時代一樣再次繪製所有內容。

任何想法都非常受歡迎。

+0

想必您可以在飛行中創建視圖?你不在你的ViewModels的任何地方存儲UIElements? – 2013-03-01 19:17:59

+0

不,我的ViewModel只包含「普通」對象,沒有UI元素。 – 2013-03-01 21:05:47

回答

0

好吧,我要管理,我現在切換回只能通過代碼做印刷。我真的很喜歡這樣做「WPF風格」,但處理多頁面問題太麻煩了。

無論如何,關於打印輸出還有一個問題,但這將是另一個問題。

1

創建一個包含顯示邏輯的UserControl(例如圖形)。抓住你的ViewModel列表和項目,然後在UserControls中,將每個ViewModel設置爲每個UserControl的DataContext。 強制每個人都呈現調用具有無限值的Measure,然後使用生成的DesiredHeight和Width進行排列。然後按照程序打印WPF圖像(linklinklink)。

+0

其實我只有一個單一的視圖模型,我不想爲每個頁面創建一個實例,因爲它們可能變得非常大(10k +行)。 – 2013-03-01 21:05:10

+0

由於您提供的信息很難猜測您的打印系統當前如何工作。你不能分享一些示例代碼嗎? – 2013-03-04 12:49:54

1

從本質上講,當且僅當您的視圖獨立工作時,這應該相當簡單;即您的ViewModel不包含放置在您的視圖中的UiElements。

簡單的解決方案是基本上打印你的視覺根。如果需要首先在用戶控件中封裝你的Views。

PrintDialog printDlg = new PrintDialog(); 
UserControl1 uc = new UserControl1(); 
printDlg.PrintVisual(uc, "User Control Printing."); 

Reference

+0

我將我的ViewModel對象從UIElements中分離出來。用戶界面元素基於DataTemplate呈現爲普通列表<...>。您輸入的代碼是否僅打印一個UserControl?因爲我想多次打印完全相同的用戶控件(這種控件通常由〜10000行組成,而每個「頁面」只有100行更改)。爲了提高速度,我想只留下9900個元素,並交換剩下的100個元素。 – 2013-03-01 21:03:48

+0

您可以在父控件內封裝任何你喜歡的東西。打印有點棘手,但基本上像您一樣正在渲染到屏幕上的打印工作,這意味着您不能在邏輯樹中使用兩次相同的控件__instance__。無論您目前在屏幕上渲染什麼,使用.Print(myWindow)嘗試打印。然後,這個想法並不是讓所有東西都放在窗口中,而是將所有東西都放在Tall UserControl中。 – 2013-03-01 21:10:00