web-dev-qa-db-fra.com

Nombre maximum de lignes pour un bloc de texte Wrap

J'ai une TextBlock avec le réglage suivant:

TextWrapping="Wrap"

Puis-je déterminer le nombre maximum de lignes?

par exemple, considérons la chaîne suivante TextBlock.Text:

This is a very good horse under the blackboard!!

Il a actuellement été montre comme ça:

This is a very 
good horse under 
the blackboard!!

J'ai besoin de ça pour devenir quelque chose comme:

This is a very 
good horse ...

toute solution?

25
MBZ

Mise à jour (pour UWP)

Dans les applications UWP, vous n'en avez pas besoin et pouvez utiliser la propriété TextBlock MaxLines (voir MSDN ).


Réponse originale:

Si vous avez une LineHeight spécifique, vous pouvez calculer le hauteur maximum pour le TextBlock.

Exemple:

TextBlock avec maximum 3 lignes

<TextBlock 
  Width="300"
  TextWrapping="Wrap" 
  TextTrimming="WordEllipsis" 
  FontSize="24" 
  LineStackingStrategy="BlockLineHeight"
  LineHeight="28"
  MaxHeight="84">YOUR TEXT</TextBlock>

C'est tout ce dont vous avez besoin pour que votre exigence fonctionne.

Comment faire cela dynamiquement?

Créez simplement un nouveau contrôle dans C #/VB.NET qui étend TextBlock et donnez-lui un nouveau DependencyPropertyint MaxLines.
Remplacez ensuite la méthode OnApplyTemplate() et définissez la variable MaxHeight en fonction de la variable LineHeight * MaxLines.

Ceci est juste une explication de base sur la façon dont vous pourriez résoudre ce problème!

45
tobi.at

Si vous avez Height, TextWrapping et TextTrimming ensemble, il se comportera exactement comme vous le souhaitez:

<TextBlock Height="60" FontSize="22" FontWeight="Thin"
    TextWrapping="Wrap" TextTrimming="CharacterEllipsis">

Le code ci-dessus englobera deux lignes, puis utilisera CharacterEllipsis au-delà de ce point.

3
Greg Lary

Sur la base des réponses de tobi.at et de gt, j'ai créé ce comportement MaxLines. Surtout, cela ne dépend pas de la définition de la propriété LineHeight en calculant la hauteur de ligne à partir de la police. Vous devez toujours définir TextWrapping et TextTrimming pour que la valeur TextBox soit rendue comme vous le souhaitez.

<TextBlock behaviours:NumLinesBehaviour.MaxLines="3" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" Text="Some text here"/>

Il existe également un comportement MinLines qui peut être différent ou défini sur le même nombre que le comportement MaxLines pour définir le nombre de lignes.

public class NumLinesBehaviour : Behavior<TextBlock>
{
    TextBlock textBlock => AssociatedObject;

    protected override void OnAttached()
    {
        base.OnAttached();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
    }

    public static readonly DependencyProperty MaxLinesProperty =
        DependencyProperty.RegisterAttached(
            "MaxLines",
            typeof(int),
            typeof(NumLinesBehaviour),
            new PropertyMetadata(default(int), OnMaxLinesPropertyChangedCallback));

    public static void SetMaxLines(DependencyObject element, int value)
    {
        element.SetValue(MaxLinesProperty, value);
    }

    public static int GetMaxLines(DependencyObject element)
    {
        return (int)element.GetValue(MaxLinesProperty);
    }

    private static void OnMaxLinesPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBlock element = d as TextBlock;
        element.MaxHeight = getLineHeight(element) * GetMaxLines(element);
    }

    public static readonly DependencyProperty MinLinesProperty =
        DependencyProperty.RegisterAttached(
            "MinLines",
            typeof(int),
            typeof(NumLinesBehaviour),
            new PropertyMetadata(default(int), OnMinLinesPropertyChangedCallback));

    public static void SetMinLines(DependencyObject element, int value)
    {
        element.SetValue(MinLinesProperty, value);
    }

    public static int GetMinLines(DependencyObject element)
    {
        return (int)element.GetValue(MinLinesProperty);
    }

    private static void OnMinLinesPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBlock element = d as TextBlock;
        element.MinHeight = getLineHeight(element) * GetMinLines(element);
    }

    private static double getLineHeight(TextBlock textBlock)
    {
        double lineHeight = textBlock.LineHeight;
        if (double.IsNaN(lineHeight))
            lineHeight = Math.Ceiling(textBlock.FontSize * textBlock.FontFamily.LineSpacing);
        return lineHeight;
    }
}
2
Itzalive

vous avez besoin du paramètre TextTrimming="WordEllipsis" dans votre TextBlock

2
Mayank

Pour toute personne développant des applications UWP ou WinRT, TextBlock a une propriété MaxLines que vous pouvez définir.

0

Sur la base de la réponse de @ artistandsocial, j'ai créé une propriété attachée pour définir le nombre maximal de lignes par programmation (plutôt que de surcharger TextBlock, ce qui est déconseillé dans WPF).

public class LineHeightBehavior
{
    public static readonly DependencyProperty MaxLinesProperty =
        DependencyProperty.RegisterAttached(
            "MaxLines",
            typeof(int),
            typeof(LineHeightBehavior),
            new PropertyMetadata(default(int), OnMaxLinesPropertyChangedCallback));

    public static void SetMaxLines(DependencyObject element, int value)
    {
        element.SetValue(MaxLinesProperty, value);
    }

    public static int GetMaxLines(DependencyObject element)
    {
        return (int)element.GetValue(MaxLinesProperty);
    }

    private static void OnMaxLinesPropertyChangedCallback(
        DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        var element = d as TextBlock;
        if (element != null)
        {
            element.MaxHeight = element.LineHeight * GetMaxLines(element);
        }
    }
}

Par défaut, la variable LineHeight est définie sur double.NaN. Cette valeur doit donc d'abord être définie manuellement.

La propriété attachée MaxLines et les autres propriétés pertinentes peuvent ensuite être définies dans une Style:

<Style TargetType="{x:Type TextBlock}"
       BasedOn="{StaticResource {x:Type TextBlock}}">
    <Setter Property="TextTrimming"
            Value="CharacterEllipsis" />
    <Setter Property="TextWrapping"
            Value="Wrap" />
    <Setter Property="LineHeight"
            Value="16" />
    <Setter Property="LineStackingStrategy"
            Value="BlockLineHeight" />
    <Setter Property="behaviors:LineHeightBehavior.MaxLines"
            Value="2" />
</Style>
0
g t