2017-02-15 3 views
0

S'il vous plaît aidez-moi à comprendre le résultat de cette opération. J'ai une application de test simple qui contient le XAML suivant.WPF RichTextBox Span change pour exécuter

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <RichTextBox x:Name="rtb"> 
     <FlowDocument> 
      <Paragraph> 
       <Span x:Name="def" Tag="default"> 
        <Run>asd</Run> 
       </Span> 
      </Paragraph> 
     </FlowDocument> 
    </RichTextBox> 
    <TextBox x:Name="tx" Grid.Row="1" TextWrapping="Wrap"/> 
</Grid> 

J'ai le code suivant derrière.

public MainWindow() 
{ 
    InitializeComponent(); 
    rtb.TextChanged += Rtb_TextChanged; 

} 
private void Rtb_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    tx.Text = XamlWriter.Save(rtb.Document); 
} 

Quand je lance ce code, et tapez quelques lettres dans le RichTextBox ci-dessus, au-dessous montre la zone de texte me XAML.

Etrangement, il perd l'envergure et se convertit en course.

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <Paragraph>as 
     <Run xml:lang="en-in" xml:space="preserve"> </Run> d 
    </Paragraph> 
</FlowDocument> 

Je ne suis pas en mesure de contrôler le changement de cette durée à exécuter. J'ai besoin d'aide pour ça.

+0

Vous remplacez le contenu de l'objet '' lorsque vous tapez. C'est juste faire ce que vous lui demandez de faire. Il s'agissait d'un objet imbriqué avec un '' contenant un ''. Votre nouveau contenu (entré manuellement) consiste uniquement en un 'Run'. –

+0

Alors, y a-t-il un moyen de le diriger dans l'intervalle plutôt que de le surcharger manuellement? – Naresh

+0

Une façon que je sais est de remplacer les événements clés et d'ajouter du texte. Mais c'est très ennuyeux. Une autre façon dont je garde un élément d'interface utilisateur hiddent et ça ne change pas. Mais je pense que ceux-ci ne sont pas précis. – Naresh

Répondre

1

Utilisez cet exemple pour voir la différence:

<Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 
     <RichTextBox x:Name="rtb"> 
      <FlowDocument> 
       <Paragraph> 
        <Span x:Name="def" Tag="default"> 
         <Run>asd</Run> 
        </Span> 
       </Paragraph> 
      <Paragraph> 
       <Span x:Name="def1" Tag="default"> 
        <Run Foreground="Red">asd</Run> 
        <Run>new</Run> 
       </Span> 
      </Paragraph> 
     </FlowDocument> 
     </RichTextBox> 
     <TextBox x:Name="tx" Grid.Row="1" TextWrapping="Wrap"/> 
     <Button Content="Click Me" Grid.Row="2" Click="tx_Click"/> 
</Grid> 

Il contient deux types de paragraphes. Une avec une simple course, qui est éliminé par Save méthode, et l'autre qui a la propriété de premier plan, qui n'est pas supprimé (Vérifiez en cliquant sur le bouton)

(Edit) dans le code derrière:

private void tx_Click(object sender, RoutedEventArgs e) 
    { 
     tx.Text = System.Windows.Markup.XamlWriter.Save(rtb.Document); 
    }