InkCanvas Children-Objekte speichern und laden?

  • WPF

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    InkCanvas Children-Objekte speichern und laden?

    Hallo zusammen,

    ich habe das Problem, dass sich beim InkCanvas-Control im
    Gegensatz zu den Strokes die Children-Objekte nicht speichern oder
    laden lassen.
    Unter InkCanvas.Children kann man Items löschen, hinzufügen,
    Anzahl abfragen, aber nicht speichern oder laden :( .
    Kann man sich vielleicht eine Funktion dazu schreiben oder sind die
    Speichern/Laden-Funktionen irgendwo in einer anderen Ecke versteckt ^^ ?

    VisualBasic-Frager

    Hallo FlashTek,

    das Serialisieren habe ich mithilfe deiner Verlinkung wie folgt gelöst:

    -VB-Code-
    Dim xs As XmlSerializer
    Dim str As New FileStream(Form1.SF.FileName, FileMode.Create, FileAccess.Write)
    sx.Serialize(str, Form1.UserControl21.InkCanvas1.Children)
    ------------
    SF.FileName = SaveFileDialog mit Name FS, davon .FileName

    zum Deserialisieren gibt es auch die passende Funktion Deserialize,
    jedoch taucht nach dem Benutzen des folgenden Codes:

    -VB-Code-
    Dim sx As XmlSerializer
    Dim fs As New FileStream(Form1.Ofd.FileName, FileMode.open, FilesAcess.Read)
    xs.Deserialize(fs)
    ------------
    Ofd.FileName = OpenFileDialog mit Name Ofd, davon .FileName


    kein
    vorher auf dem InkCanvas befindliches,
    untergeordnetes Element wieder auf.

    Was habe ich falsch gemacht?

    VisualBasic-Frager

    Es fängt schonma damit an, dass du Form1.* schreibst. Verwende Instanzen einer Form. Außerdem ist das InkCanvas nicht WPF? Dann verwende auch WPF. Keine Forms.
    Außerdem musst du natürlich mit dem xs.Deserialize(fs) was machen.
    Versuch ma den Code(nur aus dem Kopf und deshalb auch nur in C#):

    Quellcode

    1. foreach(var element in (UIElementCollection)xs.Deserialize(fs))
    2. InkCanvas1.Children.Add(element)



    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hallo thefiloe,

    es ist ein bisschen schwierig, das in VisualBasic-Code umzuwandeln ...

    Mit

    -VB-Code-
    For Each element In UIElementCollection
    xs.Deserialize(fs)
    InkCanvas1.Children.Add(element)
    Next
    ----------------

    gibt es den Fehler:
    UIElementCollection wurde nicht deklariert.

    Der Tipp von VB2010
    System.Windows.Controls einzubinden, hilft auch nicht wirklich.

    Und ich wende den Code in WinForms an.

    Wie heißt der Code in VisualBasic ?

    VisualBasic-Frager

    Es gibt auch konverter.
    For Each element In DirectCast(xs.Deserialize(fs), UIElementCollection)

    so müsste es eigentlich hinhauen. Aber wie gesagt. Ich hab sowas nie gemacht.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hallo thefiloe,

    ich habe das Serialisieren so gelöst:

    VB.NET-Quellcode

    1. Try
    2. Dim str As System.IO.TextWriter = File.CreateText(Form1.SaveFileDialog.FileName & "-Rest.txt")
    3. Form1.sx.Serialize(str, Form1.UserControl21.InkCanvas1.Children)
    4. Catch ex As Exception
    5. MsgBox("Fehler")
    6. End Try


    Leider wird hier immer die Fehler-Messagebox angezeigt.

    Das Öffnen sieht bei mir wie folgt aus:

    VB.NET-Quellcode

    1. Dim strE As StreamReader = New StreamReader(Form1.OFi.FileName & "-Rest.txt")
    2. For Each element In DirectCast(Form1.xs.Deserialize(strE), Windows.Controls.UIElementCollection)
    3. Form1.UserControl21.InkCanvas1.Children.Add(element)
    4. Next


    Form1.sx und Form1.xs sind 2 XmlSerializer.
    ---

    Das ist alles nicht so einfach :wacko: .
    Wenn der Code von euch nicht verbessert werden kann,
    gibt es vielleicht auch eine andere Speichern/Laden-Methode?

    VisualBasic-Frager

    Ach es wird ne Messagebox angezeigt. Hmmm mal überlegen... von wo soll ich den fehler wissen?
    Außerdem denke ich nicht, dass der XmlSerializer funktionieren wird(wenn serialisieren überhaupt funktioniert - wie gesagt nicht nachgeschaut war nur nen Tipp). Versuch mal den BinarySerializer.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.