我希望能够删除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,删除标记之间的新行/空白字符。
实施:
- 将段落移到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);
-
仅此而已,不会创建其他包含空格的Run。
我正在使用我们自己的自定义可本地化的ResolceDictionary子代,它可以选择删除空白,并自动处理所有这些内容。
您可以在按钮上添加负边距,使其更适合:
<InlineUIContainer><Button Margin="-3,0">?</Button></InlineUIContainer>