2016-11-13 3 views
0

Je souhaite afficher un chemin dans un TextBlock.Modification du comportement de troncature de texte

La troncature standard finit par supprimer les parties pertinentes de l'information que je veux montrer, car elle tronque d'abord la partie la plus à droite de la ligne.

Y at-il un moyen de spécifier, en XAML, que le texte devrait être tronqué à partir de la gauche plutôt que la droite? Réglage FlowDirection et TextReadingOrder ne semble pas avoir d'effet sur la direction de la troncature, comme on le voit ci-dessous:

<TextBlock Text="{Binding Path}" FontSize="18" FlowDirection="RightToLeft" TextReadingOrder="UseFlowDirection" TextTrimming="CharacterEllipsis" /> 

Est-il possible en XAML pur, ou bien la solution doit être plus complexe que cela (l'examen de la taille du bloc de texte sur la page redimensionner et modifier le texte pour compenser)?

+0

Avez-vous vérifié ma réponse? Des questions? –

Répondre

0

Je pense que vous voulez couper le texte de gauche lorsque le texte est trop long? Si tel est le cas, aucune propriété de ce type ne peut être définie pour faciliter ce travail dans UWP, vous devrez le découper vous-même.

Voici ma démo:

<TextBlock Text="Left-abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 
      abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 
      abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 
      abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 
      abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz-Right" 
      Margin="0,5" TextWrapping="NoWrap" 
      Loaded="TextBlock_Loaded" /> 

code derrière:

private void TextBlock_Loaded(object sender, RoutedEventArgs e) 
{ 
    var tb = sender as TextBlock; 
    //desired width of TextBlock 
    var desiredWidth = tb.DesiredSize.Width; 
    //cal. char. in string 
    var count = tb.Text.Count(); 
    var reducedText = tb.Text; 
    if (reducedText != "") 
    { 
     //actual width of text 
     var textWidth = tb.ActualWidth; 
     //trim count 
     var trimCount = Math.Ceiling((count/textWidth) * desiredWidth) - 4; 
     reducedText = "... " + reducedText.Substring((int)(count - trimCount), (int)trimCount); 
     tb.Text = reducedText; 
    } 
} 

Ma démonstration ne considérer que le scénario que le texte est très long (ActualWidth> DesiredWidth), vous pourrez également mettre en œuvre le scénario si la taille est suffisante pour contenir le texte. Et faites attention que cette méthode ne fonctionne que dans l'événement Loaded puisque ActualWidth sera changé en sa largeur rendue au lieu de la largeur de texte alors le TextBlock sera rendu complètement.

En outre, puisque vous utilisez la liaison de données pour la propriété Text de TextBlock, vous pouvez créer un converter pour découper le texte.