none
如何将TextBlock转换为Glyphs控件[ 位置转换]----2? RRS feed

  • 问题

  • 版主你好,上次你说的计算字符串长度的方法。

    FormattedText sFT = new FormattedText(passwordCharString,
      CultureInfo.GetCultureInfo("en-us"),
      FlowDirection.LeftToRight,
      new Typeface(passwordBox.FontFamily.ToString()),
      passwordBox.FontSize,
      Brushes.Black);
     
    
    int size = sFT.Width;

    我测试了一下,全角和半角的计算貌似有问题,

    例如 passwordCharString="1";

    和passwordCharString="1";

    得到的长度分别是6和8.2,全角占两个字符,是不是宽度为12是正确的呢?怎么会得到8.2?

    因为算得值有问题所以我放在控件上,设为右对齐时文字偏移量很多。。。

    请问有没有更好的方法,或者我的写法有问题?谢谢。

    以前的链接

    http://social.msdn.microsoft.com/Forums/zh-CN/wpfzhchs/thread/82953884-f329-4c30-b0c9-da0e1456fd09/#4e97d37b-6593-4780-866c-d841ebeaf6c8

    2012年5月2日 8:30

全部回复

  • 全角的宽度要根据具体字体和你给出的FontSize来计算,不是简单的两倍宽度。比如说,我用 Times New Roman 非等宽字体,在FontSize=12情况下,"1"和"1"分别是6和12。"a"和"a"分别是5.3和12。由于Times New Roman是非等宽字体,所以在半角下,宽度不一致,全角应该是基于全角字符Unicode的映射关系来取的,所以你即使在 Times New Roman 输入非等宽的全角字母,得出的还是等宽的字符。比如unicode 0031的"1" 对应的就是unicode FF11的"1" http://www.unicode.org/charts/PDF/UFF00.pdf,他的宽度在  Times New Roman 等于FontSize的值。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月3日 10:13
    版主
  • 谢谢回答。

    不好意思,这几天休息一直没有回复。

    哦,如果这样的话那么计算文字的宽度貌似就麻烦了。

    下面是我输出的结果。

    上面是两个TextBox输出到xps,全部都是右对齐,都有背景色,

    输出xps时,我把TextBox分为Path(用于输出背景色),Glayphs(用于输出文字)

    [作成日]因为全部都是汉字,所以右对齐没有问题,但是后面的日期因为有数字(我猜测),

    所以计算得到的字符串的宽度要比实际的字符串宽度要小,所以计算的结果不正确,显示就切去了一部分。

    这种包含数字和汉字的字符串应该如何才能正确的得到字符串的宽度呢》》》
    2012年5月7日 2:24
  • 数字在你这里都是等宽的了, 包括连标点符号也是. 所以你可以以一个汉字的宽度乘以字符数来求得长度。 不过我担心的是标点符号和你里面的空格长度计算不对,而不是数字引起的。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月7日 2:32
    版主
  • 我取得一个汉字的宽度,然后用此宽度去乘以字符的宽度,

    一个字符宽度为:12,一共有18个字符(包括中间的空格),得到的值为216,

    而TextBox的宽度仅为144,所以按照结果来看在一行是显示不开的,需要换行显示,

    但是这个结果显然是不正确的。。。

    我不清楚为什么把TextBox扔给微软的XpsDocument.Create能得到正确的位置,

    他也是把TextBox看成一个Path和Glayphs,他里面对字的位置的处理又是怎么去做的呢?

    2012年5月7日 4:19
  • XpsDocument.Create 怎么实现,只能尝试去反编译,但是看下来,他底层还是调用了Native代码,看不到了,也没有文档。

    这里纠结的问题在于符号和数字等宽,但是看了你的图,发现数字和符号是一个宽度,汉字是一个宽度,相互不等,所以这个符号宽度你去看一下是不是有你的字体决定了。我在Times New Roman 全角下,数字符号和字母是等宽的,但是你的图片似乎数字符号没有全角,且不和汉字等宽。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月23日 4:03
    版主