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

  • 问题

  • 如下面代码所示,我想把TextBlock转为Glyphs,Glyphs的位置根据什么算法去转换呢?

            <Canvas Height="233" HorizontalAlignment="Left" Margin="51,52,0,0" Name="canvas1" VerticalAlignment="Top" Width="368">
                <TextBlock Canvas.Left="57" Background="Yellow" Canvas.Top="74" FontSize="12" TextAlignment="Right" Height="30" Name="textBlock1" Text="TextBlock" Width="93" />
                <!--<Glyphs RenderTransform="1,0,0,1,0,10.25" OriginX="57" OriginY="74" FontUri="C:\WINDOWS\Fonts\TIMES.TTF" Fill="Black" FontRenderingEmSize="12" UnicodeString="TextBlock"/>-->
            </Canvas>

    我把Glyphs的OriginX属性值设置为TextBlock的Canvas.Left,OriginY属性值设为Canvas.Top,

    当TextBlock的TextAlignment属性改变时,可以通过RenderTransform的offsetX,offsetY去调整,

    但是具体调整的算法我不知道。。。

    请问如何去计算?谢谢。



    2012年4月19日 6:38

答案

  • 在WPF 还是用FormattedText 好了。

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


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

    2012年4月25日 3:25
    版主

全部回复

  • 建议是这样,Glyphs 的位置靠Matrix的offsetX,offsetY去设置,然后对齐方式靠 OriginX,OriginY设置。

    例如:

      <Canvas Height="233" HorizontalAlignment="Left" Margin="51,52,0,0" Name="canvas1" VerticalAlignment="Top" Width="368">
        <TextBlock Canvas.Left="57" Background="Yellow" Canvas.Top="74" FontSize="12" FontFamily="Times New Roman" TextAlignment="Right" Height="30" Name="textBlock1" Text="TextBlock" Width="93" />
        <Glyphs RenderTransform="1,0,0,1,57,74" Width="93" OriginX="43" FontUri="C:\WINDOWS\Fonts\TIMES.TTF" Height="30" Fill="Black" FontRenderingEmSize="12" UnicodeString="TextBlock"/>
      </Canvas>

    至于OriginX取多少, 应该在右对齐下取  Width - 文本长度。 居中则为 (Width - 文本长度)/2


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

    2012年4月23日 8:09
    版主
  • Bob斑竹,你好,感谢回答

    文本长度如何去计算呢?我不想去New一个TextBlock对象,通过它去测量文本长度,

    因为如果TextBlock太多,每次都New一个,很浪费资源,并且影响速度的。

    TextBlock还有个TextWrapping属性,还要考虑它的设定,感觉真的好麻烦。

    我的工程是个DLL,不是窗口程序。

    还有Graphics 的MeasureString方法也可以测量,

    但是在DLL中,我如何得到这个Graphics ?

    2012年4月24日 1:41
  • 我通过下面两种方法去取得文字列的宽度。

    方法1

    System.Drawing.Image img = new System.Drawing.Image(1,1);

    System.Drawing.Graphics gp = System.Drawing.Graphics.FromImage(img);

    System.Drawing.SizeF fontSize = gp.MeasureString(testGlyphs.UnicodeString, font);

    方法2

    System.Drawing.Size fontSize = System.Windows.Forms.TextRenderer.MeasureText(testGlyphs.UnicodeString,font);

    得到的fontSize的Height,Width值各不相同,

    并且都要大于了Glyphics的宽度(其实在页面上显示的内容并没有超出Glyphics的宽度),

    这是为什么呢?怎么计算出的值都不准确?

    

    2012年4月24日 9:11
  • 在WPF 还是用FormattedText 好了。

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


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

    2012年4月25日 3:25
    版主
  • 谢谢了。用FormattedText可以得到比较精确的值。
    不好意思,最近一直在麻烦你:)

    2012年4月25日 6:19
  • 没啥不好意思的,我们这里最近一直在关注Windows 8 Metro,所以这里有时候帖子会跟的比较慢,我们才应该不好意思才对。


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

    2012年4月25日 6:45
    版主