如何从WPF上的阿拉伯字符连接位置删除笔划?

我的项目使用像阿拉伯字符这样的字体,我也需要在字体上使用笔划。 我已经尝试过某种方式来显示笔划,例如:

https://stackoverflow.com/a/9887123/1900498(OuterTextBlock

https://stackoverflow.com/a/97728/1900498(OutlineText

笔画现在可以显示, 但问题是阿拉伯字符连接位置仍然显示一些笔划,所以我需要删除它

结果是这样的: 在此处输入图像描述

那么有什么方法可以从连接位置移除笔划? 我的意思是如果角色是连接,只是在完整连接上的笔划超大,而不是所有字符笔划1次。

我需要这样的结果 (我正在使用PHOTOSHOP来编辑第二张图片并从字符连接位置移除笔划,而不是WPF ,这只是为了让您了解WPF必须处理的正确结果) 在此处输入图像描述

更新:请从2链接下载2类,然后使用此代码:

  ئالما   

初步观察:您看到的工件似乎是单个字符的实际边缘。 字符会轻微触摸和重叠,而您希望将多个字符视为一个连续的形状。

我已经从评论中尝试了我的建议,从Kent Boogaart的第一个链接答案中扩展了OutlinedTextBlock类。

BuildGeometry方法中的OutlinedTextBlock获取的Geometry实例由嵌套的GeometryGroup实例组成(至少,在合并具有多个阅读方向的文本时会创建单独的此类组)。 在浏览这些组之后,您将在每个角色中找到一个PathGeometry实例。

注意:这是我在查看数据时想到的。 它可能没有文档(?),如果它发生变化,这个解决方案可能不再起作用了。

通过使用Geometry.Combine方法 ,所有这些PathGeometry实例都可以与GeometryCombineMode.Union结合使用,这意味着将合并重叠区域。

首先,我定义了一种查找所有PathGeometry对象的方法。 它递归地潜入GeometryGroup对象的层次结构,而且效率不是很高,但它有助于certificate这一点 – 随意优化这种性能:

 private IEnumerable FindAllPathGeometries(Geometry geometry) { var pathGeometry = geometry as PathGeometry; if (pathGeometry != null) { yield return pathGeometry; } else { var geoGroup = geometry as GeometryGroup; if (geoGroup != null) { foreach (var geo in geoGroup.Children) { foreach (var pg in FindAllPathGeometries(geo)) { yield return pg; } } } } } 

然后,我修改了OutlinedTextBox.EnsureGeometry方法。 最初,直接显示从BuildGeometry检索的几何体:

 private void EnsureGeometry() { if (this.textGeometry != null) { return; } this.EnsureFormattedText(); this.textGeometry = this.formattedText.BuildGeometry(new Point(0, 0)); } 

相反,我现在通过迭代所有包含的PathGeometry实例并逐步将它们与Union模式组合来处理该几何。 为方便起见(因此您可以实际观察差异),我通过添加MergeShapes属性使该行为可选:

 private void EnsureGeometry() { if (this.textGeometry != null) { return; } this.EnsureFormattedText(); var originalGeometry = this.formattedText.BuildGeometry(new Point(0, 0)); if (MergeShapes) { PathGeometry newGeo = new PathGeometry(); foreach (var pg in FindAllPathGeometries(originalGeometry)) { newGeo = Geometry.Combine(newGeo, pg, GeometryCombineMode.Union, null); } this.textGeometry = newGeo; } else { this.textGeometry = originalGeometry; } } public static readonly DependencyProperty MergeShapesProperty = DependencyProperty.Register("MergeShapes", typeof(bool), typeof(OutlinedTextBlock), new FrameworkPropertyMetadata(OnFormattedTextUpdated)); public bool MergeShapes { get { return (bool)GetValue(MergeShapesProperty); } set { SetValue(MergeShapesProperty, value); } }