2014-10-21 4 views
0

WPF를 처음 사용하고 컨트롤에 표시되는대로 내 ListBox 컨트롤 사용자 지정 항목을 인쇄하려고합니다. 목록 상자 항목의 구조는 다음과 같다 :ListBox 사용자 지정 항목 인쇄

<StackPanel Orientation="Vertical" HorizontalAlignment="Center" x:Name="PanelContainer"> 
    <Border CornerRadius="5" BorderThickness="2" BorderBrush="DarkBlue" x:Name="PanelMessage"> 
     <StackPanel Orientation="Horizontal" Background="{Binding Color}"> 
      <StackPanel Orientation="Vertical"> 
       <Image Source="{Binding SenderImage}" Width="50" Height="50" Stretch="Uniform" /> 
       <TextBlock Text="{Binding Sender}" TextAlignment="Center" Width="50" TextWrapping="Wrap" /> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> 
       <Image Source="{Binding IsRead}" Width="15" Height="15" Stretch="Uniform" 
         VerticalAlignment="Top" /> 
       <StackPanel Orientation="Vertical" Margin="5"> 
        <TextBlock x:Name="txtbTime" Text="{Binding TimeCreated}" /> 
        <TextBlock x:Name="txtbMessage" Text="{Binding MessageBody}" 
           TextWrapping="WrapWithOverflow" HorizontalAlignment="Stretch" /> 
       </StackPanel> 
      </StackPanel> 
     </StackPanel> 
    </Border> 
</StackPanel> 

내 인쇄 코드는 다음과 같다 :

UIElement myListBoxItem = 
    (UIElement) (lbMessages.ItemContainerGenerator.ContainerFromItem((Message) lbMessages.Items[i])); 
if (myListBoxItem != null) 
{ 
    string element = XamlWriter.Save(myListBoxItem); 
    MemoryStream ms = new MemoryStream(); 
    XamlWriter.Save(element, ms); 
    ms.Seek(0, SeekOrigin.Begin); 
    object obj1 = XamlReader.Load(ms); 
    BlockUIContainer bc = new BlockUIContainer(); 
    bc.Child = obj1 as UIElement; 
    fd.Blocks.Add(bc); 
    ms.Close(); 
} 
PrintDialog dialog = new PrintDialog(); 
if (dialog.ShowDialog() == true) 
    dialog.PrintDocument(idpSource.DocumentPaginator, "Hello WPF Printing."); 

내 결과가 명확 페이지입니다.

감사합니다. 감사합니다.

답변

0

DataGrid 및 ListView에 대해 동일한 문제가 있으며이 확장명으로 해결했습니다. ListBox에이 코드를 적용하면 도움이 될 수 있기를 바랍니다.

감사합니다. 1. 내 목록 상자 항목을 반복 :

using System; 
using System.IO; 
using System.Reflection; 
using System.Text; 
using System.IO.Packaging; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Markup; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Xps; 
using System.Windows.Xps.Packaging; 

var view = objToPrint as ListView; 
if (view != null) 
    PrintExtensions.PrintPreview(view); 
else 
{ 
    var grid = objToPrint as DataGrid; 
    if (grid != null) 
    PrintExtensions.PrintPreview(grid);            
} 

public static class PrintExtensions 
{ 
    private static FixedDocument ToFixedDocument(UIElement element, PrintDialog dialog) 
    { 
     var capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket); 
     var pageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight); 
     var extentSize = new Size(capabilities.PageImageableArea.ExtentWidth,capabilities.PageImageableArea.ExtentHeight); 

     var fixedDocument = new FixedDocument(); 

     element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     element.Arrange(new Rect(new Point(0, 0), element.DesiredSize)); 

     double totalHeight = element.DesiredSize.Height; 

     double yOffset = 0d; 
     while (yOffset < totalHeight) 
     { 
      var brush = new VisualBrush(element) 
            { 
             Stretch = Stretch.None, 
             AlignmentX = AlignmentX.Left, 
             AlignmentY = AlignmentY.Top, 
             ViewboxUnits = BrushMappingMode.Absolute, 
             TileMode = TileMode.None, 
             Viewbox = new Rect(0, yOffset, extentSize.Width, extentSize.Height) 
            }; 

      var pageContent = new PageContent(); 
      var page = new FixedPage(); 
      ((IAddChild)pageContent).AddChild(page); 

      fixedDocument.Pages.Add(pageContent); 
      page.Width = pageSize.Width; 
      page.Height = pageSize.Height; 

      var canvas = new Canvas(); 
      FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth); 
      FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight); 
      canvas.Width = extentSize.Width; 
      canvas.Height = extentSize.Height; 
      canvas.Background = brush; 

      page.Children.Add(canvas); 

      yOffset += extentSize.Height; 
     } 
     return fixedDocument; 
    } 

    private static ListView ToPrintFriendlyGrid(ListView source) 
    { 
     var listView = new ListView {ItemsSource = source.ItemsSource}; 

     listView.SetValue(ListViewPagingBehavior.EnablePagingProperty, false); 
     listView.Items.Filter = null; 

     ScrollViewer.SetVerticalScrollBarVisibility(listView, ScrollBarVisibility.Hidden); 
     ScrollViewer.SetHorizontalScrollBarVisibility(listView, ScrollBarVisibility.Hidden); 

     var gridView = (GridView)source.View; 
     var newGridView = new GridView(); 

     double width = 0; 
     foreach (var viewColumn in gridView.Columns) 
     { 
      var column = viewColumn; 
      if (column != null) 
      { 
       var columnType = column.GetType(); 
       var newColumn = (GridViewColumn) Activator.CreateInstance(columnType); 

       var objPropertiesArray = columnType.GetProperties(); 
       foreach (PropertyInfo info in objPropertiesArray) 
       { 
        var pin = columnType.GetProperty(info.Name); 
        if (pin != null) 
        { 
         if (pin.CanWrite) 
         { 
          object obj = info.GetValue(column, null); 
          pin.SetValue(newColumn, obj, null); 
         } 
        } 
       } 
       width += column.Width; 

       newGridView.Columns.Add(newColumn); 
      } 
     } 

     listView.Width = width; 

     var dialog = new PrintDialog(); 

     double d = Math.Round(dialog.PrintableAreaHeight/21, 2); // elementi contenuti in una pagina 
     double e = Math.Round(listView.Items.Count/d, 2); // numero di pagine ... anche se attualmente c'è qualche problema di impaginazione 

     if (Math.Truncate(e) == 0) 
      e = .95; 

     listView.Height = dialog.PrintableAreaHeight * e; 

     listView.View = newGridView; 

     return listView; 
    } 

    private static DataGrid ToPrintFriendlyGrid(DataGrid source) 
    { 
     var newGridView = new DataGrid {ItemsSource = source.ItemsSource}; 

     ScrollViewer.SetVerticalScrollBarVisibility(newGridView, ScrollBarVisibility.Hidden); 
     ScrollViewer.SetHorizontalScrollBarVisibility(newGridView, ScrollBarVisibility.Hidden); 

     double width = 0; 
     foreach (DataGridColumn gridColumn in source.Columns) 
     { 
      var column = gridColumn; 
      if (column != null) 
      { 
       Type columnType = column.GetType(); 
       var newColumn = (DataGridColumn) Activator.CreateInstance(columnType); 

       PropertyInfo[] objPropertiesArray = columnType.GetProperties(); 
       foreach (PropertyInfo info in objPropertiesArray) 
       { 
        PropertyInfo pin = columnType.GetProperty(info.Name); 
        if (pin != null) 
        { 
         if (pin.CanWrite) 
         { 
          object obj = info.GetValue(column, null); 
          pin.SetValue(newColumn, obj, null); 
         } 
        } 
       } 
       width += column.ActualWidth; 

       newGridView.Columns.Add(newColumn); 
      } 
     } 

     newGridView.Width = width; 

     var dialog = new PrintDialog(); 

     double d = Math.Round(dialog.PrintableAreaHeight/21, 2); // elementi contenuti in una pagina 
     double e = Math.Round(newGridView.Items.Count/d, 2); // numero di pagine ... anche se attualmente c'è qualche problema di impaginazione 

     if (Math.Truncate(e) == 0) 
      e = .95; 

     newGridView.Height = dialog.PrintableAreaHeight * e;   

     return newGridView; 
    } 

    public static void PrintPreview(ListView source) 
    { 
     var window = new Window {Title = "Print Preview"}; 

     var documentViewer = new DocumentViewer 
              { 
               Document = 
                ToFixedDocument(ToPrintFriendlyGrid(source), new PrintDialog()) 
              }; 
     window.Content = documentViewer; 

     window.ShowDialog(); 
    } 

    public static void Print(ListView source, bool showDialog) 
    { 
     var dialog = new PrintDialog(); 
     bool? dialogResult = showDialog ? dialog.ShowDialog() : true; 

     if (dialogResult == true) 
     { 
      var viewer = new DocumentViewer 
             { 
              Document = ToFixedDocument(ToPrintFriendlyGrid(source), dialog) 
             }; 
      dialog.PrintDocument(viewer.Document.DocumentPaginator, null); 
     } 
    } 

    public static void PrintPreview(DataGrid source) 
    { 
     var window = new Window { Title = "Print Preview" }; 

     var documentViewer = new DocumentViewer 
     { 
      Document = 
       ToFixedDocument(ToPrintFriendlyGrid(source), new PrintDialog()) 
     }; 
     window.Content = documentViewer; 

     window.ShowDialog(); 
    } 

    public static void Print(DataGrid source, bool showDialog) 
    { 
     var dialog = new PrintDialog(); 
     bool? dialogResult = showDialog ? dialog.ShowDialog() : true; 

     if (dialogResult == true) 
     { 
      var viewer = new DocumentViewer 
      { 
       Document = ToFixedDocument(ToPrintFriendlyGrid(source), dialog) 
      }; 
      dialog.PrintDocument(viewer.Document.DocumentPaginator, null); 
     } 
    }   
} 
+0

감사 @Diego,하지만 난 기능 GetPrintCapabilities를 찾을 수 없습니다, 심지어 내가 System.Printing 네임 스페이스를 수입했다. –

+0

어떤 프레임 워크 버전을 사용하십니까? 나는 ver을 사용했다. 4.0 및이 방법은 http://msdn.microsoft.com/it-it/library/ms552920(v=vs.100).aspx 여기에 설명되어 있습니다. Reg –

+0

죄송합니다 ... System.Printing.dll을 추가 했습니까? 참고? –

0

일부 검색 후 나는 다음과 같은 솔루션을 주위에 작품을 발견했습니다. 2. 값이있는 테이블을 생성하십시오. 3. 테이블 보유 값을 인쇄하십시오.

코드 :

foreach (Message message in lbMessages.Items) 
      { 

       TableRowGroup _MessageContainer = new TableRowGroup(); 

       // Rows 
       TableRow _TimeCreated = new TableRow(); 
       TableRow _imageRow = new TableRow(); 
       TableRow _TimeRow = new TableRow(); 

       // first row 
       TableCell xcell = new TableCell(new Paragraph(new Run("Image is here"))); 
       xcell.RowSpan = 2; 
       TableCell _TimeCell = new TableCell(new Paragraph(new Run(message.TimeCreated.ToString()))); 
       _TimeCreated.Cells.Add(xcell); 
       _TimeCreated.Cells.Add(_TimeCell); 

       // Second Row. 
       xcell = new TableCell(new Paragraph(new Run(message.MessageBody))); 
       _imageRow.Cells.Add(xcell); 

       // Third Row 
       xcell = new TableCell(new Paragraph(new Run(message.Sender))); 
       xcell.ColumnSpan = 2; 

       _MessageContainer.Rows.Add(_TimeCreated); 
       _MessageContainer.Rows.Add(_imageRow); 
       _MessageContainer.Rows.Add(_TimeRow); 

       Table xtable = new Table(); 
       xtable.RowGroups.Add(_MessageContainer); 
       xtable.CellSpacing = 3; 
       xtable.Background = Brushes.White; 

       document.Blocks.Add(xtable); 
} 

인쇄 코드 : 당신의 응답을

PrintDialog dialog = new PrintDialog(); 
      if (dialog.ShowDialog() == true) 
      { 
       IDocumentPaginatorSource idpSource = document; 
       dialog.PrintDocument(idpSource.DocumentPaginator, "All Messages"); 
      }