2015-06-24 3 views
0

Попытка создать страницу для печати. У меня есть следующие, в качестве примера - в основном на основе этого http://tech.pro/tutorial/881/printing-in-wpf:Почему элементы на дочернем холсте не печатаются с помощью WPF

PrintDialog printDialog = new PrintDialog(); 
printDialog.PageRangeSelection = PageRangeSelection.AllPages; 
printDialog.UserPageRangeEnabled = true; 
var doPrint = printDialog.ShowDialog(); 
if (doPrint == true) 
{   
      StackPanel myPanel = new StackPanel(); 
      myPanel.Margin = new Thickness(15); 
      Image myImage = new Image(); 
      myImage.Width = 128; 
      myImage.Stretch = Stretch.Uniform; 
      myImage.Source = new BitmapImage(new Uri("C:\\Tree.jpg", UriKind.Absolute)); 
      myPanel.Children.Add(myImage); 
      TextBlock myBlock = new TextBlock(); 
      myBlock.Text = "A Great Image."; 
      myBlock.TextAlignment = TextAlignment.Center; 
      myPanel.Children.Add(myBlock); 

      Canvas canvasL = new Canvas(); 

      canvasL.Width = 300; 
      canvasL.Height = 300; 
      canvasL.Background = Brushes.LightSteelBlue; 
      myPanel.Children.Add(canvasL); 

      Line l = new Line(); 
      l.X1 = 0; 
      l.Y1 = 0; 
      l.Y1 = 10000; 
      l.Y2 = 10000; 

      l.Stroke = Brushes.Black; 
      l.StrokeThickness = 5; 

      canvasL.Children.Add(l); 

      myPanel.Measure(new Size(printDialog.PrintableAreaWidth, 
       printDialog.PrintableAreaHeight)); 
      myPanel.Arrange(new Rect(new Point(0, 0), 
       myPanel.DesiredSize)); 

      printDialog.PrintVisual(myPanel, "A Great Image."); 
} 

изображение показывает. Текст показывает. Холст появляется в виде кобальтово-синего квадрата, но линии нигде не видно.

Что дает?

ответ

0

Вам необходимо установить положение детей на холсте, используя прикрепленные свойства. например

l.SetValue(Canvas.TopProperty, 10d); 
l.SetValue(Canvas.LeftProperty, 10d); 
l.SetValue(Canvas.RightProperty, 100d); 
l.SetValue(Canvas.BottomProperty, 100d); 
+0

«l» не имеет SetProperty, поэтому я немного смущен. Не достаточно ли установить пару X1/Y1 X2/Y2, чтобы он знал, как визуализировать? Достаточно, если он на экране .. – user340535

+0

Извините, это SetValue (... –

+0

Ни Canvas.SetTop (l, 10d), ни l.SetValue (Canvas.TopProperty, 10d), не имеет значения. – user340535

0

Agh. Muppetry.

Таким образом, тривиальный пример прослушивается, когда он устанавливает Y1 дважды. Исправьте это, и он работает.

В моем более сложном случае использовался ActualWidth, который был напечатан на 0 (в отличие от того, что он был в основном пользовательском интерфейсе), поэтому ничего не отображалось.

Смежные вопросы