Autor Beitrag
lamar
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 21.02.11 19:28 
Hallo!

Folgenden XAML String möchte ich wieder in eine Richtext-Box laden. Leider hab ich es bis jetzt nicht geschafft. ich bekomme einen Fehler

1. Wie kann diesen XAML-String in ein FlowDocument konvertieren?

Danke für eure Hilfe!

Versuch a)
=> Fehler: XAMLParseException "unbekannter Typ Paragraph kann nicht erstellt werden"
xamlstring habe ich schon mit und ohne Section probiert, mit und ohne FlowDocument Tags probiert

C#-Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
xamlString = XAML siehe unten
StringReader sr = new StringReader(xamlString);
XmlReader xmlReader = XmlReader.Create(sr);
FlowDocument fd = XamlReader.Load(xmlReader) as FlowDocument;


versuch b)
=> Fehler section ist null

C#-Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private FlowDocument GetDoc(string xamlString)
        {
            StringReader stringReader = new StringReader(xamlString);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            Section sec = XamlReader.Load(xmlReader) as Section;
            FlowDocument doc = new FlowDocument();

            while (sec.Blocks.Count > 0)
                doc.Blocks.Add(sec.Blocks.FirstBlock);
            return doc;
        }


XML-Code:
ausblenden XML-Daten
1:
<Section xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve" TextAlignment="Left" LineHeight="Auto" IsHyphenationEnabled="False" xml:lang="en-us" FlowDirection="LeftToRight" NumberSubstitution.CultureSource="Text" NumberSubstitution.Substitution="AsCulture" FontFamily="Microsoft Sans Serif" FontStyle="Normal" FontWeight="Normal" FontStretch="Normal" FontSize="11" Foreground="#FF000000" Typography.StandardLigatures="True" Typography.ContextualLigatures="True" Typography.DiscretionaryLigatures="False" Typography.HistoricalLigatures="False" Typography.AnnotationAlternates="0" Typography.ContextualAlternates="True" Typography.HistoricalForms="False" Typography.Kerning="True" Typography.CapitalSpacing="False" Typography.CaseSensitiveForms="False" Typography.StylisticSet1="False" Typography.StylisticSet2="False" Typography.StylisticSet3="False" Typography.StylisticSet4="False" Typography.StylisticSet5="False" Typography.StylisticSet6="False" Typography.StylisticSet7="False" Typography.StylisticSet8="False" Typography.StylisticSet9="False" Typography.StylisticSet10="False" Typography.StylisticSet11="False" Typography.StylisticSet12="False" Typography.StylisticSet13="False" Typography.StylisticSet14="False" Typography.StylisticSet15="False" Typography.StylisticSet16="False" Typography.StylisticSet17="False" Typography.StylisticSet18="False" Typography.StylisticSet19="False" Typography.StylisticSet20="False" Typography.Fraction="Normal" Typography.SlashedZero="False" Typography.MathematicalGreek="False" Typography.EastAsianExpertForms="False" Typography.Variants="Normal" Typography.Capitals="Normal" Typography.NumeralStyle="Normal" Typography.NumeralAlignment="Normal" Typography.EastAsianWidths="Normal" Typography.EastAsianLanguage="Normal" Typography.StandardSwashes="0" Typography.ContextualSwashes="0" Typography.StylisticAlternates="0"><Paragraph><Run xml:lang="de-at">Das ist </Run><Run xml:lang="de-at" FontWeight="Bold">ein </Run><Run xml:lang="de-at">Test!</Run></Paragraph></Section>					
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 21.02.11 20:09 
Hallo,

müßte nicht einfach folgendes funktionieren
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
using(StringReader sr = new StringReader(xamlString))
{
  TextRange tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

  tr.Load(sr, DataFormats.Xaml);
}

? (habe den Ansatz aus dem Buch "Windows Presentation Foundation" von D. Frischalowski, das ich gerade am Lesen bin, um selber in WPF einzusteigen ;-)

Wenn noch kein FlowDocument hinterlegt ist, dann mußt du vorher noch eines erzeugen:
ausblenden C#-Quelltext
1:
2:
3:
FlowDocument doc = new FlowDocument();

rtb.Document = doc;

(rtb ist dann deine RichTextBox)
lamar Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 21.02.11 20:35 
Hallo,
das funktioniert leider nicht. tr.Load benötigt einen IOStream

Zitat:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
using(StringReader sr = new StringReader(xamlString))
{
  TextRange tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

  tr.Load(sr, DataFormats.Xaml);
}



deshalb hab ich es jetzt so probiert =>
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
 using (MemoryStream xamlMemoryStream = new MemoryStream(enc.GetBytes(xamlString)))
            {
   tr = new TextRange(txtDescription.Document.ContentStart, txtDescription.Document.ContentEnd);

                tr.Load(xamlMemoryStream, DataFormats.Xaml);
}


leider bekomme ich wieder den oben genannte Fehler. Außerdem muss man ja den Inhalt der TextRange der Richtextbox zuweisen - die Frage ist nur wie? Freue mich über weitere Tipps!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 22.02.11 11:44 
Hallo lamar,

sorry wegen dem Stream-Fehler.

Ich habe nun mal deinen XAML-String in eine Textdatei gespeichert und konnte dann mit folgendem Code diese wieder fehlerfrei einlesen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
string xaml = File.ReadAllText(sFileName);

Encoding enc = Encoding.Default;
using (MemoryStream xamlMemoryStream = new MemoryStream(enc.GetBytes(xaml)))
{
  TextRange tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
  tr.Load(xamlMemoryStream, DataFormats.Xaml);
}

Die TextRange-Klasse kriegt ja schon mittels rtb.Document.ContentStart/ContentEnd den Bereich von der RichTextBox, d.h. der Inhalt der RichTextBox (bzw. des enthaltenen FlowDocuments) ändert sich dann automatisch nach Ausführen der Load-Methode.

Wenn du aber immer noch die Fehlermeldung bzgl ""unbekannter Typ Paragraph kann nicht erstellt werden" kriegst, dann muß irgendetwas an deinem System nicht in Ordnung sein.

Probiere mal mit dem Programm XamlPad ("C:\Programme\Microsoft SDKs\Windows\v6.0A\bin\XamlPad.exe"), ob folgender Code bei dir funktioniert:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <RichTextBox>
    <FlowDocument>
      <Paragraph><Run xml:lang="de-at">Das ist </Run><Run xml:lang="de-at" FontWeight="Bold">ein </Run><Run xml:lang="de-at">Test!</Run></Paragraph>
    </FlowDocument>
  </RichTextBox>
</Page>
lamar Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 22.02.11 23:25 
Hallo Th69,

danke für den Tipp :) Schön langsam komme ich dem Problem näher!

1. Ich habe Visual C# Express installiert. XAML-Pad wurde dabei leider nicht installiert (C:\Programme\Microsoft SDKs\Windows\v7.0A\bin). Deshalb habe ich mir in der Hoffnung das Microsoft SDK 7.1 heruntergeladen, indem es leider auch nicht enhalten war. Unter folgendem Link hab ich blogs.msdn.com/b/llo.../30/xamlpadx-v2.aspx hab ich mir ein selbst erstelltes XAML-Pad heruntergeladen.
a) Ist das XAML-Pad bei den Express Version nicht dabei? Wie kann ich XAML-Pad nachinstallieren?


2. Dein Beispiel XAML hat funktioniert :). Mein XAML-Code leider nicht. Folgende Dinge sind mir beim Testen meines XAML-Codes aufgefallen.

a) Ich war der Meinung das <FlowDocument> als root Element ausreicht?Das XAML-Pad hat erst mit <Page> als Root-Element den XAML-Code richtig parsen können!

b) <Section> wurde als Parse-Fehler angezeigt. Erst als ich <Section> entfernt habe, hat es funktioniert.

Freue mich weiterhin über weitere Hilfe & Tipps. (nach mittlerweile 5 Std Fehlersuche :( )

Diese Version wurde korrekt geparst:
ausblenden XML-Daten
1:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><FlowDocument><Paragraph><Run xml:lang="de-at">test </Run><Run xml:lang="de-at" FontWeight="Bold">test </Run><Run xml:lang="de-at">testeste</Run></Paragraph></FlowDocument></Page>					


Diese Version wurde NICHT korrekt geparst, obwohl ich diesen Inhalt direkt von einer RichtextBox ausgelesen habe:
ausblenden XML-Daten
1:
<Section xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve" TextAlignment="Left" LineHeight="Auto" IsHyphenationEnabled="False" xml:lang="en-us" FlowDirection="LeftToRight" NumberSubstitution.CultureSource="Text" NumberSubstitution.Substitution="AsCulture" FontFamily="Microsoft Sans Serif" FontStyle="Normal" FontWeight="Normal" FontStretch="Normal" FontSize="11" Foreground="#FF000000" Typography.StandardLigatures="True" Typography.ContextualLigatures="True" Typography.DiscretionaryLigatures="False" Typography.HistoricalLigatures="False" Typography.AnnotationAlternates="0" Typography.ContextualAlternates="True" Typography.HistoricalForms="False" Typography.Kerning="True" Typography.CapitalSpacing="False" Typography.CaseSensitiveForms="False" Typography.StylisticSet1="False" Typography.StylisticSet2="False" Typography.StylisticSet3="False" Typography.StylisticSet4="False" Typography.StylisticSet5="False" Typography.StylisticSet6="False" Typography.StylisticSet7="False" Typography.StylisticSet8="False" Typography.StylisticSet9="False" Typography.StylisticSet10="False" Typography.StylisticSet11="False" Typography.StylisticSet12="False" Typography.StylisticSet13="False" Typography.StylisticSet14="False" Typography.StylisticSet15="False" Typography.StylisticSet16="False" Typography.StylisticSet17="False" Typography.StylisticSet18="False" Typography.StylisticSet19="False" Typography.StylisticSet20="False" Typography.Fraction="Normal" Typography.SlashedZero="False" Typography.MathematicalGreek="False" Typography.EastAsianExpertForms="False" Typography.Variants="Normal" Typography.Capitals="Normal" Typography.NumeralStyle="Normal" Typography.NumeralAlignment="Normal" Typography.EastAsianWidths="Normal" Typography.EastAsianLanguage="Normal" Typography.StandardSwashes="0" Typography.ContextualSwashes="0" Typography.StylisticAlternates="0"><Paragraph><Run xml:lang="de-at">Das ist </Run><Run xml:lang="de-at" FontWeight="Bold">ein </Run><Run xml:lang="de-at">Test!</Run></Paragraph></Section>					
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 23.02.11 11:49 
Hallo lamar,

mit dem XamlPad und dem Test-XAML-Code wollte ich nur schauen, ob du dort auch einen Fehler kriegst - aber anscheinend läuft es ja (zur Info: dort kannst du nur Page bzw. einen anderen UI-Container als Root-Element eingeben).
Wie du schon gesehen hast, speichert die RichTextBox aber einen etwas anderen Xaml-Code, nämlich mit dem <Section>-Tag als Root-Element.

Hast du denn mal meinen C#-Code mit deinem Xaml-String mal ausprobiert? Welche Fehlermeldung erhältst du dort genau?

Ich habe mal die RichTextBoxProj-Anwendung (aus dem WPF-Buch) in den Anhang geladen.
Speichere mal einfach deinen Xaml-String in eine Datei ab, stelle in dem Programm die ComboBox auf "Xaml" und öffne diese Datei (2. Button von links)...

P.S: Warum das XamlPad nicht mehr im Windows SDK 7.x enthalten ist, weiß ich leider auch nicht... (ich habe mir aber auch jetzt das XamlPadX runtergeladen - danke für den Link ;-))
Einloggen, um Attachments anzusehen!
lamar Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 24.02.11 22:02 
Hallo Th69,

danke für die Testanwendung. Speichern und Öffnen des XAMLs mit der RichTextBoxProj hat einwandfrei funktioniert. Jetzt werde ich das abgespeicherte XAML noch mit "meinem XAML" ausführlich vergleichen und testen. Sobald ich etwas herausgefunden habe, werde ichs hier posten. Irgendwas stimmt bei meinem c# Code nicht :(.

Hab deinen c#-Code habe ich natürlich sofort getestet und vergessen das dazu zu schreiben. Leider habe ich hier auch wieder die oben genannte Fehlermeldung Fehler: XAMLParseException "unbekannter Typ Paragraph kann nicht erstellt werden" bekommen.
lamar Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 28.02.11 23:04 
Jetzt bin ich endlich draufgekommen ich hatte die Anführungszeichen mit \ versehen, damit ich z.B. den Sectionteil hard kodiert im Code einfügen konnte. Nachdem ich die Anführungzeichen " durch einfache Anführungszeichen ' ersetzt habe. hats dann endlich funktioniert!



Vielen Dank nochmals für deine Hilfe Th69!