1
因此,我正在構建一個WPF拖放設計器。從項目控制獲取ItemsPanel
一旦用戶完成設計,我希望他們能夠打印他們擁有的東西。
這是工作,直到我決定我的畫布上的所有項目應該實際上是數據綁定到視圖模型。爲此,我將我的畫布包裹在一個Items控件中。我現在遇到的問題是我構建的打印函數無法訪問畫布以進行打印。我樂於接受建議。
<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>
C#
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);
}
}
首先從ItemsControl元素生成位圖,然後打印位圖可能會更容易。 –