this works
FixedDocumentSeqeunce fixedDocumentSeqeunce = XPSdoc.GetFixedDocumentSeqeunce();
DocumentPaginator paginator = fixedDocumentSeqeunce.DocumentPaginator;
printDialog.PrintDocument(paginator, "Title");
this fails
AnnotationDocumentPaginator adp = new AnnotationDocumentPaginator(paginator, service.Store);
// same paginator as above
printDialog.PrintDocument(adp, "Title");
printDialog.PrintDocument(adp, "Title"); is what is killing it
Somehow it appears to be corrupting the XPSdoc
Store appears to be good - I can get a count of the annotations
It fail even if I create zero annotations
But the print itself does not fail - I get a valid print
A try catch on the above does not catch an error
A few seconds after the print get errors starting with
(I have a handler for unhandled exceptions)
The specified visual is not an ancestor of the Visual
App crashes and the XPS document is never repainted in the DocumentViewer
I am able to get FlowDocuments with ScrollViewer to print annotation fine
And create the store the same way so I think that code is fine
.NET 4.5
Don't know what is going on in my larger program but I cannot reproduce it on a smaller program right now
Figure it out
In the failed code I was NOT using
FixedDocumentSeqeunce fixedDocumentSeqeunce = XPSdoc.GetFixedDocumentSeqeunce();
In the printDialog.PrintDocument I was using the EXACT same fixedDocumentSeqeunce the control was bound to. Print must alter fixedDocumentSeqeunce so it needs a fresh fixedDocumentSeqeunce.
<Window x:Class="APSannotate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ann="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework"
Loaded="Window_Loaded"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Row="0" Grid.Column="0" Click="click" Content="Print"/>
<Button Grid.Row="0" Grid.Column="1" Content="Sticky" Width="50" HorizontalAlignment="Left"
Command="ann:AnnotationService.CreateTextStickyNoteCommand"
CommandTarget="{Binding ElementName=docViewer}"/>
<DocumentViewer Grid.Row="1" Grid.ColumnSpan="2" Document="{Binding Path=FixedDocSeq}" Name="docViewer"/>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Xps;
using System.Windows.Annotations;
using System.IO;
using System.Xml;
namespace APSannotate
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
AnnotationService _annotService;
//FileStream _annotStream;
System.Windows.Annotations.Storage.XmlStreamStore _annotStore;
System.Windows.Xps.Packaging.XpsDocument xpsDoc;
//MemoryStream _streamAnnoMem;
public MainWindow()
{
this.DataContext = this;
xpsDoc = new System.Windows.Xps.Packaging.XpsDocument(@"c:\temp\ann.xps", System.IO.FileAccess.Read);
InitializeComponent();
}
public FixedDocumentSequence FixedDocSeq
{
get { return xpsDoc.GetFixedDocumentSequence(); }
}
private void click(object sender, RoutedEventArgs e)
{
PrintDialog printDialog = new PrintDialog();
bool? result = printDialog.ShowDialog();
if (result != null && result.Value)
{
DocumentPaginator documentPaginator = FixedDocSeq.DocumentPaginator;
printDialog.PrintDocument(documentPaginator, "documentPaginator");
AnnotationService service = AnnotationService.GetService(docViewer);
AnnotationDocumentPaginator annotationDocumentPaginator = new AnnotationDocumentPaginator(documentPaginator, service.Store);
printDialog.PrintDocument(annotationDocumentPaginator, "annotationDocumentPaginator");
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
StartAnnotations();
}
private void StartAnnotations()
{
// If there is no AnnotationService yet, create one.
if (_annotService == null)
// docViewer is a document viewing control named in Window1.xaml.
_annotService = new AnnotationService(docViewer);
// If the AnnotationService is currently enabled, disable it.
if (_annotService.IsEnabled == true)
_annotService.Disable();
// Open a stream to the file for storing annotations.
//_annotStream = new FileStream(@"c:\temp\annoStore", FileMode.OpenOrCreate, FileAccess.ReadWrite);
// Create an AnnotationStore using the file stream.
//_annotStore = new System.Windows.Annotations.Storage.XmlStreamStore(_annotStream);
MemoryStream _streamAnnoMem = new MemoryStream();
_annotStore = new System.Windows.Annotations.Storage.XmlStreamStore(_streamAnnoMem);
// Enable the AnnotationService using the new store.
_annotService.Enable(_annotStore);
}// end:StartAnnotations()
}
}