Получить ItemsPanel из элементов управления

1

Поэтому я создаю дизайнер WPF drag and drop.

Как только пользователь будет выполнен, я хочу, чтобы они могли печатать то, что у них есть.

Это работало до тех пор, пока я не решил, что все элементы на моем холсте действительно должны быть привязаны к модели представления. Для этого я завернул свой холст в Элементе управления. Проблема, с которой я столкнулся сейчас, заключается в том, что функция печати, которую я построил, не может получить доступ к холсту для ее печати. Я открыт для предложений.

<ItemsControl x:Name="CanvasItemsControl" Grid.Column="1" Width="600" Height="800"  ItemsSource="{Binding CanvasElements}">
    <ItemsControl.ItemsPanel>
       <ItemsPanelTemplate>
           <Canvas Grid.Column="1" AllowDrop="True" Width="600" Height="800" 
                  x:Name="CanvasControl"                
                  Background="White"  
                  DragEnter="CanvasFlowDocument_DragEnter" 
                  DragLeave="CanvasFlowDocument_DragLeave" 
                  DragOver="CanvasFlowDocument_DragOver" 
                  Drop="CanvasFlowDocument_Drop"/>
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
           <DataTemplate>
              <controls:CanvasElement />
           </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

С#

 private void PrintCanvas()
 {

   PrintDialog pd = new PrintDialog();

   if (pd.ShowDialog() == true)
   {

     /*

      NEED TO ACCESS CANVAS CONTROL HERE TO PRINT

      I KNOW THE BELOW PRINT METHOD WORKS. 

      IT WORKED UNTIL I ADDED THE ITEMS CONTROL WRAPPER AROUND THE CANVAS                

     */


      //get the size of the printer page 
      PrintCapabilities capabilities = pd.PrintQueue.GetPrintCapabilities(pd.PrintTicket);

      double pageMargin = Math.Min(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight);

      double additionalMargin = Math.Max(0, 20 - pageMargin);
      Size pageSize = new Size(capabilities.PageImageableArea.ExtentWidth - additionalMargin * 2, capabilities.PageImageableArea.ExtentHeight - additionalMargin * 2);

      //get scale of the print wrt to screen of WPF visual 
      double scale = Math.Min(pageSize.Width / CanvasControl.ActualWidth, pageSize.Height / CanvasControl.ActualHeight);
      Size printSize = new Size(CanvasControl.ActualWidth * scale, CanvasControl.ActualHeight * scale);

      Point upperLeft = new Point(capabilities.PageImageableArea.OriginWidth + additionalMargin, capabilities.PageImageableArea.OriginHeight + additionalMargin);

      //Transform the Visual to scale 
      CanvasControl.LayoutTransform = new ScaleTransform(scale, scale);
      CanvasControl.Measure(printSize);
      CanvasControl.Arrange(new Rect(upperLeft, printSize));


      FlowDocument CanvasFlowDocument = new FlowDocument();
      BlockUIContainer buiCont = new BlockUIContainer();


      CanvasControl.Drop -= CanvasFlowDocument_Drop;
      CanvasControl.DragOver -= CanvasFlowDocument_DragOver;
      CanvasControl.DragLeave -= CanvasFlowDocument_DragLeave;
      CanvasControl.DragLeave -= CanvasFlowDocument_DragEnter;


      Grid parent = (Grid)CanvasControl.Parent;

      parent.Children.Remove(CanvasControl);

      buiCont.Child = CanvasControl;
      CanvasFlowDocument.Blocks.Add(buiCont);

      pd.PrintDocument((CanvasFlowDocument as IDocumentPaginatorSource).DocumentPaginator, "Template");

      CanvasFlowDocument.Blocks.Clear();
      buiCont.Child = null;

      ReloadUI(parent);
   }
}
  • 0
    Может быть проще сначала создать растровое изображение из элемента ItemsControl , а затем распечатать растровое изображение.
Теги:
wpf
canvas

1 ответ

1
Лучший ответ

Вы должны иметь возможность использовать PrintDialog.PrintVisual(Visual, string), чтобы распечатать свой контроль напрямую. Возможно, вам придется играть с размером, но код, который вы должны изменить, должен работать. См. Это сообщение, которое похоже и ссылки на эту статью как возможное решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню