2012-08-10 144 views
1

我有一個列表框,其ItemsSource是綁定的。無論如何,將每個單獨的列表框項目轉換爲運行時屏幕上顯示的內容的圖像?將ListBoxItem轉換爲圖像

編輯:

我現在有這個權利,它似乎並沒有被工作雖然...

ListBoxItem item = new ListBoxItem(); 
     item = (ListBoxItem)(lb1.ItemContainerGenerator.ContainerFromIndex(0)); 

     //itempres = item.Content as ItemsPresenter; 

     //double width = itempres.ActualWidth; 
     //double height = itempres.ActualHeight; 
     double width = item.Width; 
     double height = item.Height; 

     //RenderTargetBitmap bmpCopied = new RenderTargetBitmap((int)Math.Round(width), (int)Math.Round(height), 100, 100, PixelFormats.Default); 
     RenderTargetBitmap bmpCopied = new RenderTargetBitmap(100, 500, 100, 100, PixelFormats.Default); 
     DrawingVisual drawingVisual = new DrawingVisual(); 
     using (DrawingContext drawingContext = drawingVisual.RenderOpen()) 
     { 
      VisualBrush visualBrush = new VisualBrush(item); 
      drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(), new Size(width, height))); 
     } 
     bmpCopied.Render(drawingVisual); 

     displayImage = new Image(); 
     displayImage.Source = bmpCopied; 

     fd.Blocks.Add(new BlockUIContainer(displayImage)); 
      //ListBox lbNew = new ListBox(); 
      //lbNew.Style = lb1.Style; 
      //lbNew.ItemsSource = lb1.ItemsSource; 
      //lbNew.ItemContainerStyle = lb1.ItemContainerStyle; 
      //lbNew.ItemTemplateSelector = lb1.ItemTemplateSelector; 
      //UIElement elementAll = lbNew as UIElement; 
      //fd.Blocks.Clear(); 
      //fd.Blocks.Add(new BlockUIContainer(elementAll)); 
     //} 

     PrintDialog pd = new PrintDialog(); 

     if (pd.ShowDialog() == true) 
     { 
      fd.PageHeight = pd.PrintableAreaHeight; 
      fd.PageWidth = pd.PrintableAreaWidth; 
      fd.PagePadding = new Thickness(96); 

      IDocumentPaginatorSource dps = fd; 
      pd.PrintDocument(dps.DocumentPaginator, "flow doc"); 
     } 
+3

你能解釋一下你想要做更多一點嗎?你想讓你的列表框項目成爲圖像,或者你只是想將列表框項目,因爲它們出現,轉換成圖像,有點像屏幕帽子? – 2012-08-10 13:53:09

+1

什麼是綁定?圖像路徑的ObservableCollection? – 2012-08-10 13:53:19

+0

我想將列表框項目顯示爲圖像時轉換爲屏幕截圖。 Listbox綁定到我創建的類型的可觀察集合。謝謝。 – KateMak 2012-08-10 14:04:23

回答

1

這段代碼工作正常我,我沒有嘗試打印圖像,因爲我沒有一臺打印機現在,但圖像在測試應用程序,我創建

var listBoxItem = listBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem; 
      RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality); 
      RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap((int)listBoxItem.ActualWidth, 
                      (int)listBoxItem.ActualHeight, 96, 96, 
                      PixelFormats.Pbgra32); 
      renderTargetBitmap.Render(listBoxItem); 
      image.Source = renderTargetBitmap; 
      image.Width = listBoxItem.ActualWidth; 
      image.Height = listBoxItem.ActualHeight; 
+0

謝謝!!!!!!!!!!!!!!!!!!!!!!!!我嘗試了你發佈的部分和工作:D !!!!!!!!!!!! – KateMak 2012-08-10 15:06:34

+0

還有一個問題,如果你可以......當我把它放在一個循環中時,只有第一個圖像似乎在渲染......任何想法? – KateMak 2012-08-10 16:12:28

0

我只是回答了一分鐘前:Display a line at grids background

使用Visualbrush創建一個畫筆,然後簡單地創建一個Drawingcontext並繪製一個矩形作爲你的Visualbrush的例子

+0

請參閱上面的我的代碼。這與你的意思相似嗎? – KateMak 2012-08-10 14:32:15

0

正確地呈現我沒有信譽評論 - 所以爲了增加Dtex的回答:

ListBoxItems對於RenderTargetBitmap來說似乎很奇怪。 我能夠呈現一個ListBoxItem本身的直接子像這樣以解決此問題:

var itemChildVisual = VisualTreeHelper.GetChild(listBoxItem,0) as Visual; 
renderTargetBitmap.Render(itemChildVisual); 

這非常適合我。

希望這會有所幫助!