2017-09-18 18 views
0

の幅を調整する方法はありますか?文字をWPF textBlockまたはGlyphRun要素に挿入しますか?文字幅を設定する

私は、文字間のスペースを増やしたくありませんが、絵のように文字そのものの幅を大きくする:

enter image description here

画面上に以下のコードを印刷文字「ABC abc '、どうすればいいですかの文字数は200%または300%ですか?

私が思う
<Window x:Class="WpfApp1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="200" Width="300"> 
    <Grid> 
     <Image Stretch="None" SnapsToDevicePixels="True"> 
      <Image.Source> 
       <DrawingImage x:Name="drawingImage" /> 
      </Image.Source> 
     </Image> 
    </Grid> 
</Window> 
public partial class MainWindow : Window 
{ 

    GlyphTypeface glyphTypeface; 
    double renderingEmSize, advanceWidth, advanceHeight; 
    Point baselineOrigin; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     new Typeface("segoe ui").TryGetGlyphTypeface(out glyphTypeface); 

     renderingEmSize = 12; 

     advanceWidth = glyphTypeface.AdvanceWidths[0] * renderingEmSize; 
     advanceHeight = glyphTypeface.Height * renderingEmSize; 
     baselineOrigin = new Point(0, glyphTypeface.Baseline * renderingEmSize); 

     drawingImage.Drawing = Render(); 

    } 

    private Drawing Render() 
    { 
     var line = "ABC abc"; 

     var drawing = new DrawingGroup(); 
     using (var drawingContext = drawing.Open()) 
     { 
      var glyphRun = ConvertTextToGlyphRun(
       glyphTypeface, renderingEmSize, 
       advanceWidth, advanceHeight, 
       baselineOrigin, line); 

      var guidelines = new GuidelineSet(); 
      guidelines.GuidelinesX.Add(baselineOrigin.X); 
      guidelines.GuidelinesY.Add(baselineOrigin.Y); 
      drawingContext.PushGuidelineSet(guidelines); 
      drawingContext.DrawGlyphRun(Brushes.Black, glyphRun); 
      drawingContext.Pop(); 
     } 

     return drawing; 
    } 

    static GlyphRun ConvertTextToGlyphRun(
     GlyphTypeface glyphTypeface, 
     double renderingEmSize, 
     double advanceWidth, 
     double advanceHeight, 
     Point baselineOrigin, 
     string line) 
    { 
     var glyphIndices = new List<ushort>(); 
     var advanceWidths = new List<double>(); 
     var glyphOffsets = new List<Point>(); 

     var y = baselineOrigin.Y; 
     var x = baselineOrigin.X; 

     for (int j = 0; j < line.Length; ++j) 
     { 
      var glyphIndex = glyphTypeface.CharacterToGlyphMap[line[j]]; 
      glyphIndices.Add(glyphIndex); 
      advanceWidths.Add(0); 
      glyphOffsets.Add(new Point(x, y)); 
      x += glyphTypeface.AdvanceWidths[glyphIndex] * renderingEmSize; 
     } 

     return new GlyphRun(
      glyphTypeface, 
      0, 
      false, 
      renderingEmSize, 
      glyphIndices, 
      baselineOrigin, 
      advanceWidths, 
      glyphOffsets, 
      null, null, null, null, null); 
    } 
} 
+0

[WPF TextBoxで文字間隔やカーニングを指定するにはどうすればよいですか?](https://stackoverflow.com/questions/5843562/how-can-i-specify-letter-spacing-or-kerning) -in-a-wpf-textbox) – David

+0

重複しない文字間のスペースを増やしたいのではなく、文字自体の幅を広げたい –

+0

@DavidDayこれはまったく逆です。 「文字間の間隔を変更する」方法を尋ねる一方で、質問者は「文字間のスペースを広げたくない」と質問しています。 – Clemens

答えて

1

に役立ちます:hereから

drawingContext.PushGuidelineSet(guidelines); 
drawingContext.PushTransform(new ScaleTransform(2, 1)); // <= new line 
drawingContext.DrawGlyphRun(Brushes.Black, glyphRun); 
drawingContext.Pop();         // <= new line 
drawingContext.Pop(); 

を。

0

、それがなければならない変換のためのあなたのコードに2行追加

<StackPanel> 
    <TextBox x:Name="originalABC">ABC</TextBox> 
    <TextBlock x:Name="transformedABC"> 
     <TextBlock.RenderTransform> 
      <ScaleTransform CenterX="0" CenterY="0" ScaleX="3" ScaleY="1" /> 
     </TextBlock.RenderTransform> 
     ABC 
    </TextBlock> 
</StackPanel> 

screenshot

+0

ありがとうございます。特定の文字だけが他の文字より広く、すべてのテキストではないという方法がありますか? –

関連する問題