2012-02-03 8 views
2

私は、文字列の幅を測定するために、次のWPFコードにWindowsランタイムと同等のを見つけることができなかった:それはメトロで行うことができる場合メトロの文字列の幅を(表示せずに)どのように計算できますか?

FormattedText formattedText = new FormattedText(in_string,in_culture,in_flowdir,in_font,in_sz,in_color); 
string_width = formattedText.WidthIncludingTrailingWhitespace); 

誰もが知っていますか?

+1

ルーカスを不透明度0でそれを表示して取得する(ただ命題を回避策として、現時点では何のAPIが存在しない場合) –

+1

おかげについて、あなたは私を指摘してきましたか?正しい方向に。しかし、それを測定するためにコントロールをビジュアルツリーに追加する必要はありません。下の私の答えを見てください。私はそれがすべての状況で与えられた実用的な解決策であることに疑問を持っています。 –

答えて

5

ことが可能ですが、私は便利な測定を与える一つの方法を見つけたが、私はそれを行うための最善の方法であることを確認していない:

// Setup the TextBlock with *everything* that affects how it 
// will be drawn (this is not a complete example) 
TextBlock^ tb = ref new TextBlock; 
tb->VerticalAlignment = Windows::UI::Xaml::VerticalAlignment::Top; 
tb->HorizontalAlignment = Windows::UI::Xaml::HorizontalAlignment::Left; 
tb->Height = in_height; 
tb->Text = text; 

// Be sure to tell Measure() the correct dimensions that the TextBox 
// have to draw in! 
tb->Measure(SizeHelper::FromDimensions(Parent->Width,Parent->Height)); 
text_width = tb->DesiredSize.Width; 

私の直感では状況があるということですこのコードは予期しない結果を与えます。

+0

このメソッドは、上の例のコードのように後続の空白を含みません。どのようにそれを含むように強制するかについてのアイデア(別のサイズなので、改行しないスペースを使用することはありません)? – borrrden

+0

@borrrden - これについては、既知のビットのテキストを追加した後に文字列を測定し、測定が終了した後にその既知のテキストの長さを減算することしかできませんでした。 –

2

これを試してみてください:

private double stringWidth(string s, double fontSize) 
    { 
     if(s==" ") 
      s = "\u00A0"; //this line wasn't required in silverlight but is now 

     TextBlock t = new TextBlock() 
     { 
      FontSize = fontSize, 
      Text = s 
     }; 
     t.Measure(new Size(double.MaxValue, double.MaxValue)); //this line wasn't required in silverlight but is now 
     return t.ActualWidth; 
    } 
関連する問題