【问题标题】:Remove white spaces between C# Flowdocument elements?删除 C# Flowdocument 元素之间的空格?
【发布时间】:2012-07-25 17:07:49
【问题描述】:

我希望能够删除 FlowDocument 的各种内联元素之间的空白。下面是一个非常具体的例子,只是为了让问题更清楚。所需的输出是“Hello World?”但是会发生什么是“Hello World?”。在这种情况下 ”?”是一个可点击的按钮。

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

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

【问题讨论】:

  • 一次运行似乎在最后得到了 1/2 的空间。我不知道有什么办法。

标签: c# wpf richtextbox flowdocument


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    好的,这个问题是因为special whitespace handling rules.

    解决方案的想法: 预处理 xaml 删除标签之间的新行/空白字符。

    实施

    1. 将段落移动到 ResourceDictionary(例如 Strings.xaml)。
    2. 将 Strings.xaml 的“构建操作”设置为“资源”(以便将其存储为文本,而不是二进制)。
    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. 就是这样,不会再创建其他带有空格的运行。

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

    【讨论】:

      【解决方案3】:

      您可以为按钮添加负边距以使其更贴合:

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

      【讨论】:

      • 我认为这不是一个好的解决方案。请继续阅读下面的答案。