gpt4 book ai didi

c# - 当字体不支持符号时,如何在WPF文本框中插入版权,商标,服务标记等

转载 作者:太空狗 更新时间:2023-10-29 21:42:16 27 4
gpt4 key购买 nike

我们有一个WPF应用程序,它显示包含各种公司符号的文本。例如商标,注册商标,版权和服务商标。

该数据库具有包含标准公司符号的某些字段。最初,数据标记如下:
Example Corp(TM) or Example Plan (SM)
我们可以轻松地将占位符更改为其各自的Unicode等效项。实际上在大多数情况下都有

我们遇到的问题是应用程序使用的字体不支持服务标记符号(这只是一个上标SM)。我们有可能无法替换字体或对其进行编辑。

这些字段可以是一个简单的产品名称,在其末尾带有符号,也可以是一个长说明,其中符号包含0次或多次。我们将TextBoxes或Labels直接绑定(bind)到ViewModel和/或业务对象(通常通过DataTemplates)。应用程序中的所有数据都是只读的。

因此,假设我们必须通过代码(在C#和WPF中)解决此问题,我有什么选择?

最佳答案

编辑:我在另一个答案中发现TextBlock也有一个Inlines集合,可以向其中添加RunAnvaka's answer巧妙地将附加属性用作一种转换器。

我对如何解决这个问题有一些想法。只有一个人能正确处理自动换行,并能处理使用不同字体的字符。

使用FlowDocumentScrollViewer并使用ValueConverter将字符串绑定(bind)到字符串,该字符串将字符串转换为FlowDocument

<FlowDocumentScrollViewer
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
Document="{Binding MyString, Converter={StaticResource MyConverter}}" />

您可以在转换器上创建属性以设置常规字体属性,该属性不能在 FlowDocumentScrollViewer上设置,而必须在转换器创建的 FlowDocument上设置。您可能还需要一些Font属性,以用于需要不同Font(以及可能不同大小)的异常子字符串。另一个选择是在其中的某些属性( Binding)的 FlowDocument上创建 RelativeSource

这是在代码中创建 FlowDocument的方法:
FlowDocument doc = new FlowDocument();
doc.FontFamily = new FontFamily( "Our Own Font" );
Paragraph par = new Paragraph();
doc.Blocks.Add( par );

然后,您需要在特殊子字符串上拆分传入的字符串,同时保持这些子字符串完整无缺。您必须滚动自己的分离器,并在转换器中或提供给转换器的子字符串集合。

在段落中添加一个普通的子字符串:
Run r = new Run( substring );
par.Inlines.Add( r );

使用不同的字体将特殊的子字符串添加到段落中:
Run r = new Run( substring );
r.FontFamily = new FontFamily( "Arial" );
par.Inlines.Add( r );

以上只是一些小片段。由于我对数据不熟悉,所以我不知道您要如何分割字符串或遍历子字符串,因此我没有提供我打耳光的方法只是为了看看我的想法是否可行。您还可以使用 Dictionary来检测一个子字符串并在输出中使用替换,例如检测 "(SM)"并将其替换为 "℠"

让我知道您是否有任何疑问,或者有什么我想说的。

(您最好说它是只读的。 RichTextBox不能工作,因为它的 Document属性不是 DependencyProperty,因此不能成为 Binding的目标。尽管,有人可以使用 Mode=OneWayToSource对其进行反转,实现 ConvertBack而不是 Convert。)

"I think what you left out (iterating over the string and creating those Runs) is the tricky part."



对于在特殊子字符串上拆分字符串,我确实非常简短。当我说“我不知道您将如何分割字符串”时,我并不是说我根本不知道该怎么做(我改写了它),但是我不知道您会如何想处理它。我认为您不难发现这部分内容,因为这是我可能要雇用的人才会想到的字符串处理问题。这样,您可能会发现数据中的一些极端情况,这些情况需要更改处理方式。

我将使用 IndexOf()Substring()向您介绍一个相对粗糙的版本。

因此,这就是问题所在:您有很多包含0个或多个特殊子字符串的字符串(例如 "Company Name(R), makers of Product(TM)")。这些子字符串很少而且是已知的,并且需要将输入字符串拆分为几个字符串,在这些字符串中,特殊和非特殊子字符串已相互隔离(例如 {"Company Name", "(R)", ", makers of Product", "(TM)"})。

特殊的子字符串很少而且是已知的,因此您需要一个这样的数组。您可以通过 .IndexOf()的返回值知道是否找到了子字符串。遍历已知的特殊子字符串,您可以通过索引比较找到其中任何一个的第一个实例,同时也保留子字符串的长度。

每次您在字符串 S(如果有)中找到最早的特殊子字符串时,都将派生字符串 ABCB是特殊的子字符串, AC是之前和之后。将 AB附加到 List,并且 C成为新的 S,然后再次进行操作。除非您在 S中没有找到特殊的子字符串并且它不为空,否则您只需要将其全部附加即可。

现在, List中的每个奇数索引字符串都是一个特殊的子字符串。您可能想引用我在此答案的上半部分提到的 Dictionary,当您找到的子字符串为 Run时,可以用作查找来添加 "℠""(SM)"的查询。

关于c# - 当字体不支持符号时,如何在WPF文本框中插入版权,商标,服务标记等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156541/

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