删除C#Flowdocument元素之间的空白



我希望能够删除FlowDocument的各种内联元素之间的空白。下面是一个非常具体的例子来说明问题。所需的输出是"Hello World?",但实际输出是"你好世界?"。在这种情况下,"?"是一个可点击的按钮。

我找了一段时间都没有成功。我尝试了所有形式的垫/边距调整,但它们只能增加间距。我开始相信这个空间是FlowDocument元素边界所固有的。这似乎是一个系列限制。

<RichTextBox>
  <FlowDocument>
    <Paragraph Margin="0">
      <Run>
        Hello World
      </Run>
      <InlineUIContainer>
        <Button Click="ButtonClick">?</Button>
      </InlineUIContainer>
    </Paragraph>
  </FlowDocument>
</RichTextBox>

尽管格式看起来很难看,但在基于XML的XAML中,如果希望在运行之间避免空白,则不能在元素的关闭标记和打开标记之间留出任何空间。试试这个:

<RichTextBox>
  <FlowDocument>
    <Paragraph Margin="0">
      <Run>
         Hello World
       </Run><InlineUIContainer>
           <Button Margin="0" >?</Button>
       </InlineUIContainer>
    </Paragraph>
  </FlowDocument>
</RichTextBox>

好的,这个问题是由于特殊的空白处理规则。

解决方案理念:预处理xaml,删除标记之间的新行/空白字符。

实施

  1. 将段落移到ResourceDictionary中(例如Strings.xaml)
  2. 将Strings.xaml的"Build Action"设置为"Resource"(因此它将存储为文本,而不是二进制)
  3. 加载它,使用以下代码删除空白:

    var uri = @"pack://application:,,,/YourProjectName;component/PathToDictionary/Strings.xaml";
    var resourceInfo = Application.GetResourceStream(uri);
    using (var xmlReader = new XmlTextReader(resourceInfo.Stream) { WhitespaceHandling = WhitespaceHandling.None})
    {                    
        var xamlReader = new System.Windows.Markup.XamlReader();                    
        dictionary = (ResourceDictionary)xamlReader.LoadAsync(xmlReader);
    }
    
  4. 将资源字典添加到实体的资源中,实体应使用以下段落:

    MyControl.Resources.MergedDictionaries.Add(dictionary);
    
  5. 仅此而已,不会创建其他包含空格的Run。

我正在使用我们自己的自定义可本地化的ResolceDictionary子代,它可以选择删除空白,并自动处理所有这些内容。

您可以在按钮上添加负边距,使其更适合:

<InlineUIContainer><Button Margin="-3,0">?</Button></InlineUIContainer>

最新更新