Загрузка аннотаций WPF в XPS - PullRequest
0 голосов
/ 24 января 2020

В процессе изучения использования класса AnnotationService с XML Спецификацией бумаги (XPS) я попытался сохранить и загрузить созданные аннотации. С аннотациями Save - все просто (это описано в Microsoft ), но с нагрузкой - никакой информации (без каких-либо методов «Чтение» / «Запись»). Существуют некоторые методы «Чтение» / «Запись» для класса AnnotationResource, но я не могу понять, как его можно использовать для загрузки аннотации для использования после с классом обслуживания Annotation. Если вы знаете, кто это будет работать, интересно посмотреть на это?

1 Ответ

0 голосов
/ 24 января 2020

Я нашел обходной путь для загрузки ранее созданных аннотаций в XPS: я создал отдельный класс MyAnnotationStore (потому что XmlStreamStore запечатан) с помощью конструкторов и трех методов:

  • EnableAnnotations () - простой включить аннотацию (временное хранение в MemoryStream);
  • SaveAnnotations () - сохранить аннотацию в FileStream;
  • LoadAnnotations () - загрузить аннотацию из FileStream и включить аннотацию;

Примечание по _storeMemory.Position = 0; без него аннотации не сохраняются и не загружаются правильно

    public class MyAnnotationStore 
    {
     XmlStreamStore _storeXML;
     MemoryStream _storeMemory;
     AnnotationService _anoService;

    public MyAnnotationStore(FlowDocumentReader myDocumentReader)
    {
        // Create the AnnotationService object that works
        // with our FlowDocumentReader.
        _anoService = new AnnotationService(myDocumentReader);

        // Create a MemoryStream which will hold the annotations.
        _storeMemory = new MemoryStream();
    }

    public void EnableAnnotations()
    {
        // Now, create a XML-based store based on the MemoryStream.
        // You could use this object to programmatically add, delete
        // or find annotations.
        _storeXML = new XmlStreamStore(_storeMemory);

        // Enable the annotation services.
        _anoService.Enable(_storeXML);
    }


    public void SaveAnnotations()
    {
        _storeXML.Flush();
        _storeMemory.Flush();
        using (FileStream fileStream = new FileStream("StickNotes.xml", FileMode.Create))
        {
            _storeMemory.Position = 0;
            _storeMemory.CopyTo(fileStream);
        }
    }

    public void LoadAnnotations()
    {
        FileStream fileStream = null;
        try
        {
            fileStream = new FileStream("StickNotes.xml", FileMode.Open, FileAccess.Read);
            fileStream.CopyTo(_storeMemory);
            _storeMemory.Position = 0;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error File Read", MessageBoxButton.OK, MessageBoxImage.Error);
        }
        finally
        {
            if (fileStream != null) fileStream.Close();
        }

        // Enable the annotation services after loading annotations from fileStream
        EnableAnnotations();
     }

    }

Для целей тестирования с кодом

    public partial class MainWindow : Window
    {
        MyAnnotationStore anoStore;

        public MainWindow()
        {
            InitializeComponent();
            // Create object for manipulate with annotations in myDocumentReader (load and create)
            anoStore = new MyAnnotationStore(myDocumentReader);
        }
}

и XAML

<FlowDocumentReader x:Name="myDocumentReader" Height="238.9">
                        <FlowDocument>
                            <Section>
                                <Paragraph>
                                    Here are some fun facts about the WPF Document API!
                                </Paragraph>
                            </Section>
                        </FlowDocument>
                    </FlowDocumentReader>
...