以编程方式添加XAML中定义的内联

时间:2019-06-09 15:28:07

标签: wpf

我有一个FlowDocument。是否可以向其中添加内联但该内联是在XAML中定义的。例如

<FlowDocument >
  <Paragraph Name="Output"/>
</FlowDocument>

var AppendTo = new Span();
var XAML = "<Run>Something</Run>";
AppendTo.Inlines.Add(XAML); // This is what I mean - adding elements using XAML
Output.Inlines.Add(AppendTo);

谢谢

注意-那些投票赞成关闭它的人,因为它太广泛了。也许读完我标记为答案的答案,然后思考问题出在哪里。

2 个答案:

答案 0 :(得分:1)

您可以使用Run方法以编程方式从XAML字符串中创建实际的XamlReader.Parse元素或任何其他类型的元素:

var AppendTo = new Span();
var pc = new System.Windows.Markup.ParserContext();
pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
var run= System.Windows.Markup.XamlReader.Parse("<Run>Something</Run>", pc) as Run;
AppendTo.Inlines.Add(run);
Output.Inlines.Add(AppendTo);

答案 1 :(得分:0)

当然可以。为所有相关元素分配名称会更容易。

FlowDocument被定义为Control

的资源
  <Window.Resources>
    <FlowDocument x:Key="Document">
      <Paragraph Name="Inline" />
    </FlowDocument>
  </Window.Resources>

Control的代码隐藏文件中,您可以使用FrameworkElement.TryFindResource(object) : objectFrameworkElement.FindResource(object) : object来浏览控件的资源:

private void OnLoaded(object sender, RoutedEventArgs e)
{
  if (TryFindResource("Document") is FlowDocument document)
  {
    foreach (Block documentBlock in document.Blocks)
    {
      if (documentBlock is Paragraph paragraph || documentBlock.Name.Equals("Inline", StringComparison.OrdinalIgnoreCase))
      {
        // Do something with the Paragraph
      }
    }
  }
}

FlowDocument被定义为Control可视树的元素

<Window>
  <Grid SnapsToDevicePixels="True">
    <RichTextBox>
      <RichTextBox.Document>
        <FlowDocument x:Name="Document">
          <Paragraph Name="Inline" />
        </FlowDocument>
      </RichTextBox.Document>
    </RichTextBox>
  </Grid>
</Window>

在代码后面,只需按其名称访问元素。可以通过自动生成的字段引用来访问分配了Name值的每个元素:

private void OnLoaded(object sender, RoutedEventArgs e)
{
  Paragraph paragraph = this.Inline;
  // Do something with the Paragraph
}

VisualTreeHelper也可用于遍历树形图并搜索文档或内联元素,