2012-02-03 2 views
2

мне не удалось найти эквивалент среды выполнения Windows для следующего кода WPF измерить ширину строки:Как я могу рассчитать ширину строки в Metro (не отображая ее)?

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; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^