2017-02-15 11 views
0

Пожалуйста, помогите мне понять результат этой операции.WPF RichTextBox Span изменяется на Run

У меня есть простое тестовое приложение, которое содержит следующий XAML.

<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> 

У меня есть следующий код.

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

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

Когда я запускаю этот код и введите несколько букв в приведенном выше RichTextBox ниже текстовое поле показывает мне XAML.

Странно, он теряет пролет и преобразует его в бег.

<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> 

Я не могу контролировать изменение этого диапазона для запуска. Мне нужна помощь.

+0

Вы переопределяете содержимое объекта '' при вводе. Это просто то, что вы просите об этом. Это был вложенный объект с '', содержащий ''. Ваше новое (введенное вручную) содержимое состоит только из 'Run'. –

+0

Итак, есть ли способ, которым я направляю его в диапазон, а не вручную переопределять его? – Naresh

+0

Один из способов, которым я знаю, - переопределить ключевые события и добавить текст. Но это очень утомительно. Еще один способ сохранить элемент hident ui, и он не меняется. Но я чувствую, что это неточно. – Naresh

ответ

1

Используйте этот пример, чтобы увидеть разницу:

<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> 

Он содержит два вида пунктов. Один с простым Run, который удаляется с помощью Save способа, а другой, который имеет Foreground свойства, которое не удаляются (Проверьте это, нажав на кнопку)

(Edit) в коде позади:

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