如何从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); } }