gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:18:52 25 4
gpt4 key购买 nike

我的项目使用了一些字体,比如Arabic character,我还需要在字体上使用描边。我已经尝试了一些方法来显示笔画,例如:

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

https://stackoverflow.com/a/97728/1900498 (大纲文本)

现在可以显示笔画了,但是问题是阿拉伯字符连接位置还是显示了一些笔画,需要去掉

结果是这样的: enter image description here

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

我需要这样的结果(我正在使用PHOTOSHOP编辑第二张图片并从字符连接位置移除笔画,而不是WPF,这只是为了让您了解正确的结果必须由 WPF 处理) enter image description here

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

<Window x:Class="test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:test"
Title="MainWindow" Height="200" Width="400">
<Grid Background="Black">
<local:OutlinedTextBlock HorizontalAlignment="Left" Height="200" VerticalAlignment="Bottom" FontSize="150" StrokeThickness="1" Fill="White" Stroke="Red" TextDecorations="">ئالما</local:OutlinedTextBlock>
<local:OutlinedText HorizontalAlignment="Right" Height="200" VerticalAlignment="Top" FontSize="150" StrokeThickness="1" Fill="White" Stroke="Red" Text="ئالما"></local:OutlinedText>
</Grid>

最佳答案

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

我通过扩展 first linked answer 中的 OutlinedTextBlock 类尝试了评论中的建议通过 Kent Boogaart .

Geometry OutlinedTextBlockBuildGeometry method 获得的实例由嵌套的 GeometryGroup 组成实例(至少,当合并具有多个阅读方向的文本时,会创建单独的此类组)。浏览完这些组后,您会发现一个 PathGeometry每个字符的实例。

注意:这是我在查看数据时得出的结论。它可能没有记录(?),如果它发生变化,这个解决方案可能不再有效。

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

首先,我定义了一个方法来查找所有 PathGeometry 对象。它递归地深入到 GeometryGroup 对象的层次结构中,效率不高,但它可以证明这一点 - 请随意优化此性能:

private IEnumerable<PathGeometry> 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);
}
}

关于c# - 如何从 WPF 上的阿拉伯字符连接位置删除笔划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25382597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com