Поэтому я создаю дизайнер 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);
}
}
Вы должны иметь возможность использовать PrintDialog.PrintVisual(Visual, string), чтобы распечатать свой контроль напрямую. Возможно, вам придется играть с размером, но код, который вы должны изменить, должен работать. См. Это сообщение, которое похоже и ссылки на эту статью как возможное решение.
ItemsControl
, а затем распечатать растровое изображение.