FlowDocument in Frame zu XPS, Deklaration des eingebetten Flowdocuments

  • WPF

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    FlowDocument in Frame zu XPS, Deklaration des eingebetten Flowdocuments

    Ich versuche sehr erfolglos ein Flowdocument "freunde.xaml" als XPS zu erstellen.
    Das FlowDocument wird zur Laufzeit in einen Frame geladen und soll danach als XPS gedruckt werden.
    Wie deklariere ich das FlowDoc damit es zur Laufzeit gefunden wird?

    Folgenden Code verwende ich:

    XML-Quellcode

    1. <Frame Name="MyFrame" Grid.Row="1"/>


    VB.NET-Quellcode

    1. Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    2. MyFrame.Navigate(New Uri("Freunde.xaml", UriKind.RelativeOrAbsolute))
    3. End Sub
    4. Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    5. Dim datum = Date.Today
    6. Dim titel = "FlowDocumet-Test"
    7. Dim fileName As String = datum & " " & titel & ".xps"
    8. [b]Dim druckbereich = Me.MyFlowDokument -> hier sollte "freunde.xaml" stehen[/b]
    9. Dim IDocumentPaginatorSource As IDocumentPaginatorSource = MyFlowDokument
    10. Dim xps As XpsDocument = New XpsDocument(fileName, FileAccess.Write)
    11. Dim writer As XpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xps)
    12. writer.Write(CType(druckbereich, IDocumentPaginatorSource).DocumentPaginator)
    13. xps.Close()
    14. Process.Start(fileName)
    15. End Sub
    16. Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    17. MyFrame.Navigate(New Uri("Freunde.xaml", UriKind.RelativeOrAbsolute))
    18. End Sub


    Im Anhang das Projekt zum Verständnis
    Dateien
    Hallo

    Habe mir die Solution mal schnell geladen.
    Erstmal musst du zusehen das deine "Freunde.xaml" im Ausgabeordner (oder wo anders) landet.
    Ich habe dies mal bewerkstellgt indem ich in dem Eigenschaften die BuildAction auf "Content" gestellt habe und es immer Kopieren lasse wenn sich diese ändert.



    Also hast du nun das XAML mal überhaupt zur Laufzeit zur Verfügung. Das ist auch schon die halbe Miete. Jetzt musst du diese nur noch einlesen.

    VB.NET-Quellcode

    1. Private Function GetXamlObject(filename As String) As FlowDocument
    2. Using sr As New StreamReader(filename)
    3. Dim rootObj As DependencyObject = TryCast(XamlReader.Load(sr.BaseStream), DependencyObject)
    4. Return CType(rootObj, FlowDocument)
    5. End Using
    6. End Function


    Und so rufst du die Prozedur in denem code auf:

    VB.NET-Quellcode

    1. Dim druckbereich = GetXamlObject(Environment.CurrentDirectory & "\Freunde.xaml")


    Dann klappt es auch.



    Zwei Dinge noch:
    .) Schliesse bitte deinen anderen Thread ab. Danke
    .) Schmeiss die unbenötigten Imports raus und mach Option Strict On. Du wirst es dir noch Danken.


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.
    Hallo Sascha; ich danke DIr sehr für Deine Hilfe.

    1) Wenn ich Buildvorgang von "Page" auf "Inhalt" setze erfolgt beim Laden die Fehlermeldung: "Die Datei "...Drucken von Dokumenten\bin\Debug\Freunde.xaml" konnte nicht gefunden werden.

    2) Bei "Page" wird das xaml in den Frame geladen.

    Wenn 2) ausgeführt wird und gedruckt werden soll kommt die Fehlermeldung bei Using sr As New StreamReader(filename) "Die Datei ...konnte nicht gefunden werden"

    Bei

    VB.NET-Quellcode

    1. Dim rootObj As DependencyObject = TryCast(XamlReader.Load(sr.BaseStream), DependencyObject)
    wird der Fehler "Load ist kein Member von System XAML.XAML Reader"

    Folgende Verweise sind gesetzt:

    Imports System.Windows.Xps.Packaging
    Imports System.IO
    Imports System.Windows.Xps
    Imports System.Xaml
    Imports System.Xaml.XamlReader

    In o.g. Beispiel wird immer nur das xaml Freunde angesprochen. Wenn die xaml wechseln z.B. Freunde, Feinde wir selectiere ich dann die geladene Page und passe den Druckbereich an?

    Ich danke DIr sehr.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thomas2705“ ()

    Thomas2705 schrieb:

    Wenn ich Buildvorgang von "Page" auf "Inhalt" setze erfolgt beim Laden die Fehlermeldung

    Bitte lese nochmals meinen Beitrag. Du musst auch einstellen das die Datei ins Ausgabeverzeichniss kopiert wird. Bitte genau lesen.

    Thomas2705 schrieb:

    kommt die Fehlermeldung bei Using sr As New StreamReader(filename) "Die Datei ...konnte nicht gefunden werden

    Na genau. Logisch wenn du oben liest.

    Thomas2705 schrieb:

    Folgende Verweise sind gesetzt

    Ne, das sind keine Verweise sondern Imports. Der XamlReader liegt im Namespace System.Windows.Markup insofern musst du diesen auch Importieren.
    Also Imports System.Windows.Markup. Ein Blick in den Objektkatalog hätte dir hier einiges erspart. =O

    Thomas2705 schrieb:

    In o.g. Beispiel wird immer nur das xaml Freunde angesprochen. Wenn die xaml wechseln z.B. Freunde, Feinde wir selectiere ich dann die geladene Page und passe den Druckbereich an?

    Da gibt es mehrere möglichkeiten. Beispiel: Mit einem Dialogfenster dazwischen wo der User in einem Dropdown auswählen kann welche "Vorlage" er nimmt.
    Aber das ist dann ein anderes Thema. wie ich in der anderen frage von dir schon geschrieben haben. Du wirst für jeden schritt unsere Hilfe benötigen wenn du nicht anfängst die Basics zu lernen. Und das macht dir doch selbst keinen spass oder? Nimm dir die Zeit und lerne ein Buch, probiere die Beispiel und mache dann mit deinem Projekt weiter.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.