[WPF] Opgemaakte tekst weergeven

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 18-05 20:55
Hello allemaal,

bij een projectje in C# icm WPF ben ik op een probleempje gestuit. Ik heb een hoop objecten in een boomstructuur, elk met een stringproperty die opgemaakte tekst bevat. (een geserializeerd FlowDocument-object). Deze bevat eigenlijk maar 1 regel en er moeten wat basisopmaak mogelijkheden zijn zoals kleur wijzigen, vet, italic, etc.

Deze property bind ik aan een TreeView met een aangepaste TreeViewItem-template. Het FlowDocument geef ik dan weer in een FlowDocumentScrollViewer waarvan ik de mogelijkheden zoveel mogelijk naar beneden schroef, maar echt ideaal is dit niet, want het is behoorlijk overkill. Ik stuit op allerlei problemen ivm marges. Verder schikt de inhoud van een FlowDocument zich naar de container, ipv omgekeerd, waardoor een TreeViewItem steeds een bepaalde breedte heeft.

Misschien heeft iemand van jullie een gouden tip: Is er iemand die een andere mogelijkheid weet om opgemaakte tekst weer te geven in een WPF-omgeving? Of een UIElement dat niet zo uitgebreid is als de FlowDocumentScrollViewer of een FlowDocumentReader?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je het niet gewoon met een TextBlock doen? Die kun je ook helemaal stylen, die style properties zou je dan kunnen binden aan je object.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 18-05 20:55
Bedankt voor je antwoord Woy. Dat is iets dat ik ook al overwogen heb, maar er moeten individuele woorden opgemaakt kunnen worden. En dit lukt niet met een TextBlock voor zover ik weet. En een FlowDocument is meteen zo'n overkill.

Acties:
  • 0 Henk 'm!

  • Koen_R
  • Registratie: Juni 1999
  • Laatst online: 22:40
In een textblock kan je met <run> ook meerdere stijlen gebruiken.


code:
1
2
3
4
<TextBlock>
  <Run>Hello, </Run>
  <Run FontWeight="Bold">world</Run>
</TextBlock>

Acties:
  • 0 Henk 'm!

  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 18-05 20:55
Hmm, da's een mooie. Die wist ik niet (tot mijn spijt ;))

Wanneer ik die inhoud echter tracht te serializeren/deserializeren, krijg ik echter de inhoud van de <Run>-elementen niet te zien.

code:
1
2
3
4
5
<TextBlock>
    Dit is een test:
    <Run>Test</Run>
    <Run FontWeight="Bold">Test</Run>
</TextBlock>


Geeft deze geserialiseerde string:
XML:
1
2
<?xml version="1.0"?>
<string>Dit is een test: </string>


Of zie ik iets over het hoofd? Is het ook te voorkomen dat, wanneer je een string editeert in een RichTextBox, deze daar meteen een FlowDocument van maakt?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat ligt denk aan je manier van Serializeren. Met de XamlWriter/XamlReader kun je ieder geval wel gewoon de juiste opmaak behouden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 18-05 20:55
Met een XamlWriter of TextRange.Save werkt het inderdaad!

Hoe kan ik die string nu in dat TextBlock krijgen? Gewoon binden aan de Text-property van het TextBlock lijkt niet te werken? Nog een laatste gouden tip?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het ligt er een beetje aan wat je precies wil, maar je zou het gedeserialiseerde object gewoon in code aan je container toe kunnen voegen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Wanneer je die string deserializeerd krijg je Inlines terug en het TextBlock heeft hiervoor een property Inlines. Ik denk dat je er dan wel uit kunt komen.

Acties:
  • 0 Henk 'm!

  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 18-05 20:55
Bedankt voor jullie hulp, het inladen lukt met een TextRange tijdens het DataContextChanged-event.

De inhoud ziet er exact hetzelfde uit als met een FlowDocumentScrollViewer. Alleen zonder alle tralala errond ;-)

Nu krijg ik echter wel een fout bij het deserialiseren van de inhoud zoals Koen Rotteveel het voorstelde. (En die ik ook nodig heb, zonder alle markup van paragrafen enzo, want die zorgen voor storende marges die ik niet nodig heb.) Verder bewaart de RichtTextBox zijn inhoud steeds als een volwaardig FlowDocument, dus dat zal ik ook moeten trachten af te vangen.

XML:
1
2
3
    Dit is een test:
    <Run>Test</Run>
    <Run FontWeight="Bold">Test</Run>


kan niet gedeserialiseerd worden, omdat hij geen Run-elementen toelaat rechtstreeks in het Section-element.

XML:
1
&lt;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="User" NumberSubstitution.Substitution="AsCulture" FontFamily="Segoe UI" FontStyle="Normal" FontWeight="Normal" FontStretch="Normal" FontSize="12" 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" HasTrailingParagraphBreakOnPaste="False"&gt;&lt;Run NumberSubstitution.CultureSource="Text"&gt;Dit is een test: &lt;/Run&gt;&lt;Run NumberSubstitution.CultureSource="Text"&gt;Test&lt;/Run&gt;&lt;Run NumberSubstitution.CultureSource="Text"&gt; &lt;/Run&gt;&lt;Run NumberSubstitution.CultureSource="Text" FontWeight="Bold"&gt;Test&lt;/Run&gt;&lt;/Section&gt;


Ik zoek nog even verder.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

kan niet gedeserialiseerd worden, omdat hij geen Run-elementen toelaat rechtstreeks in het Section-element.
Klopt, een section mag alleen block elementen bevatten. Je zult aan je section een paragraph moeten toevoegen. Een paragraph heeft wel support voor inline elementen.

Content Model: Section enforces a strong content model for child content. Child elements contained in a Section element must be derived from Block. 
Valid child elements include:
- BlockUIContainer
- List
- Paragraph
- Section
- Table


Misschien is het verstandig dat je misschien even de MSDN induikt?

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • ShadowrunR
  • Registratie: Maart 2002
  • Laatst online: 18-05 20:55
Hey Niemand_Anders, bedankt voor je antwoord, dat had ik inderdaad ook gezien.

Ik gebruik al een tijdje de methode om een string te deserializeren/serialiseren en te binden aan een RichTextBox of FlowDocumentScrollViewer dmv een AttachedProperties-klasse en een converter.

Ik was op zoek naar eenvoudigere methode om een simpele regel opgemaakte tekst op te slaan. Maar ik denk dat het standaard niet mogelijk is. Een laatste mogelijkheid is om vanuit een rtf- of html string vanuit code Run-elementen met de juiste eigenschappen te gaan genereren en die te gaan toevoegen aan de TextBlock.

Ik denk dat er geen manier is om opgemaakte tekst op te slaan zonder gebruik te maken van Sections met daarin paragrafen e.d., wat vervelend is want ik wil enkel 1 opgemaakte regel zonder marges van paragrafen enzo.

Ik denk dat ik maar terugval op mijn eerste idee, zoals ook Woy het voorstelt.
Pagina: 1