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?
Dans les applications UWP, vous n'en avez pas besoin et pouvez utiliser la propriété TextBlock MaxLines
(voir MSDN ).
Si vous avez une LineHeight
spécifique, vous pouvez calculer le hauteur maximum pour le TextBlock.
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.
Créez simplement un nouveau contrôle dans C #/VB.NET qui étend TextBlock
et donnez-lui un nouveau DependencyProperty
int 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!
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.
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;
}
}
vous avez besoin du paramètre TextTrimming="WordEllipsis"
dans votre TextBlock
Pour toute personne développant des applications UWP ou WinRT, TextBlock
a une propriété MaxLines
que vous pouvez définir.
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>