Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否删除C#Flowdocument元素之间的空白?_C#_Wpf_Richtextbox_Flowdocument - Fatal编程技术网

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

是否删除C#Flowdocument元素之间的空白?,c#,wpf,richtextbox,flowdocument,C#,Wpf,Richtextbox,Flowdocument,我希望能够删除FlowDocument中各种内联元素之间的空白。下面是一个非常具体的例子,只是为了说明问题。所需的输出是“Hello World?”,但发生的是“Hello World?”。在这种情况下“?”是一个可点击的按钮 我找了一段时间都没有成功。我尝试了所有形式的衬垫/边距调整,但它们只能增加间距。我开始相信空间是FlowDocument元素边界固有的。这似乎是一系列的限制 <RichTextBox> <FlowDocument> <Paragr

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

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

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

你好,世界
?

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

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

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

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

你好,世界
?

好的,这个问题是由于

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

实施

  • 将段落移动到ResourceDictionary(例如Strings.xaml)
  • 将Strings.xaml的“Build Action”设置为“Resource”(这样它将存储为文本,而不是二进制)
  • 加载它,使用以下代码删除空白:

    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);
    }
    
  • 将资源字典添加到实体的资源中,应使用以下段落:

    MyControl.Resources.MergedDictionaries.Add(dictionary);
    
  • 仅此而已,不会创建包含空格的额外运行


  • 我正在使用我们自己定制的可本地化ResorceDictionary子代,wich有一个删除空白的选项,并自动处理所有这些内容。

    一次运行似乎会在最后得到1/2的空间。我不知道如何解决这个问题。我认为这不是一个好的解决办法。请继续阅读下面的答案。