2009-11-04 6 views
7

so che TextBlock può presentare un FlowDocument, ad esempio:Impostazione testo WPF per TextBlock

<TextBlock Name="txtFont"> 
    <Run Foreground="Maroon" FontFamily="Courier New" FontSize="24">Courier New 24</Run> 
</TextBlock> 

Mi piacerebbe sapere come impostare un FlowDocument che viene memorizzato in una variabile per un TextBlock. Sto cercando qualcosa di simile:

string text = "<Run Foreground="Maroon" FontFamily="Courier New" FontSize="24">Courier New 24</Run>" 
txtFont.Text = text; 

Tuttavia, il risultato del codice di cui sopra è che il testo XAML viene presentato non analizzata.


EDIT: Credo che la mia domanda non era abbastanza chiaro. Quello che sto davvero cercando di achive è:

  1. L'input da parte dell'utente del testo in un RichTextBox.
  2. L'applicazione salva l'utente come FlowDocument dal RichTextBox e lo serializza sul disco.
  3. Il FlowDocument è deserializzato dal disco alla variabile testo.
  4. Ora, vorrei essere in grado di presentare il testo utente in un TextBlock.

Pertanto, per quanto ho capito, la creazione di un nuovo oggetto Run e impostare manualmente i parametri non risolverà il mio problema.


Il problema è che la serializzazione RichTextBox crea Sezione oggetto, che non posso aggiungere a TextBlock.Inlines. Pertanto, non è possibile impostare l'oggetto deserializzato su TextProperty di TextBlock.

risposta

3

so che TextBlock può presentare FlowDocument

Cosa ti fa pensare questo? Non penso sia vero ... Il contenuto di un TextBlock è la proprietà Inlines, che è un InlineCollection. Quindi può contenere solo Inline s ...Ma in un FlowDocument, il contenuto è la proprietà Blocks, che contiene istanze di Block. E un Block non è un

5

creare e aggiungere l'oggetto come di seguito:

 Run run = new Run("Courier New 24"); 
     run.Foreground = new SolidColorBrush(Colors.Maroon); 
     run.FontFamily = new FontFamily("Courier New"); 
     run.FontSize = 24; 
     txtFont.Inlines.Add(run); 
+3

run.Foreground = Brushes.Maroon; – CannibalSmith

+0

true Cannibal. Grazie. :) – Blounty

+0

Grazie per la soluzione. Si prega di consultare la mia modifica. – Elad

0

Se il FlowDocument è stato deserializzata, significa che si dispone di un oggetto di tipo FlowDocument, giusto? Prova a impostare la proprietà Text di TextBlock su questo valore. Naturalmente, non è possibile farlo con txtFont.Text = ..., poiché questo funziona solo per le stringhe. Per altri tipi di oggetti, è necessario impostare direttamente la DependencyProperty:

txtFont.SetValue(TextBlock.TextProperty, myFlowDocument) 
0

Ecco come impostiamo l'aspetto di un blocco di testo assegnando uno stile al volo.

// Set Weight (Property setting is a string like "Bold") 
    FontWeight thisWeight = (FontWeight)new FontWeightConverter().ConvertFromString(Properties.Settings.Default.DealerMessageFontWeightValue); 

    // Set Color (Property setting is a string like "Red" or "Black") 
    SolidColorBrush thisColor = (SolidColorBrush)new BrushConverter().ConvertFromString(Properties.Settings.Default.DealerMessageFontColorValue); 

    // Set the style for the dealer message 
    // Font Family Property setting is a string like "Arial" 
    // Font Size Property setting is an int like 12, a double would also work 
    Style newStyle = new Style 
    { 
     TargetType = typeof(TextBlock), 
     Setters = { 
      new Setter 
      { 
       Property = Control.FontFamilyProperty, 
       Value = new FontFamily(Properties.Settings.Default.DealerMessageFontValue) 
      }, 
      new Setter 
      { 
       Property = Control.FontSizeProperty, 
       Value = Properties.Settings.Default.DealerMessageFontSizeValue 
      }, 
      new Setter 
      { 
       Property = Control.FontWeightProperty, 
       Value = thisWeight 
      }, 
      new Setter 
      { 
       Property = Control.ForegroundProperty, 
       Value = thisColor 
      } 
     } 
    }; 

    textBlock_DealerMessage.Style = newStyle; 

È possibile eliminare la sezione di stile e impostare direttamente le proprietà, ma ci piace mantenere le cose in bundle in stile per aiutarci a organizzare l'aspetto nel corso del progetto.

textBlock_DealerMessage.FontWeight = thisWeight; 

HTH.