2016-03-13 10 views
11

In WPF, questo è stato possibile utilizzando FormattedText, in questo modo:Come posso misurare la dimensione del testo nelle app UWP?

private Size MeasureString(string candidate) 
{ 
    var formattedText = new FormattedText(
     candidate, 
     CultureInfo.CurrentUICulture, 
     FlowDirection.LeftToRight, 
     new Typeface(this.textBlock.FontFamily, this.textBlock.FontStyle, this.textBlock.FontWeight, this.textBlock.FontStretch), 
     this.textBlock.FontSize, 
     Brushes.Black); 

    return new Size(formattedText.Width, formattedText.Height); 
} 

Ma in UWP questa classe non esiste più. Quindi, come è possibile calcolare le dimensioni del testo nella piattaforma universale di Windows?

risposta

23

In UWP, si crea un TextBlock, impostare le sue proprietà (come Text, FontSize), e quindi chiamare il suo metodo Measure e passare in termini di dimensioni infinite.

var tb = new TextBlock { Text = "Text", FontSize = 10 }; 
tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

Dopo che la sua proprietà DesiredSize contiene la dimensione TextBlock avrà.

+5

@Reddy io non sono così veloce (anche se io vorrei essere). Quando si fa una domanda, viene visualizzata una casella di controllo "rispondi alla tua domanda". L'ho fatto perché non ho trovato alcuna domanda o risposta a questo problema su SO, in modo che altri lo trovino (si spera) e non debbano cercarlo per ore. – Domysee

+3

Si noti che questo non è specifico per UWP. Funzionerebbe anche in WPF o Silverlight. – Clemens

+0

@MarcelW Non sei sicuro di cosa intendi. Funziona bene anche per me, anche in WPF. – Clemens

0

Ecco un approccio alternativo utilizzando Win2D:

private Size MeasureTextSize(string text, CanvasTextFormat textFormat, float limitedToWidth = 0.0f, float limitedToHeight = 0.0f) 
{ 
    var device = CanvasDevice.GetSharedDevice(); 

    var layout = new CanvasTextLayout(device, text, textFormat, limitedToWidth, limitedToHeight); 

    var width = layout.DrawBounds.Width; 
    var height = layout.DrawBounds.Height; 

    return new Size(width, height); 
} 

è possibile utilizzarlo in questo modo:

string text = "Lorem ipsum dolor sit amet"; 

CanvasTextFormat textFormat = new CanvasTextFormat 
{ 
    FontSize = 16, 
    WordWrapping = CanvasWordWrapping.WholeWord, 
}; 

Size textSize = this.MeasureTextSize(text, textFormat, 320.0f); 

Source

Problemi correlati