@artistandsocialの回答に基づいて、添付プロパティを作成して、プログラムで最大行数を設定しました(TextBlock
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(TextBlock element, int value) => element.SetValue(MaxLinesProperty, value);
public static int GetMaxLines(TextBlock element) =>(int)element.GetValue(MaxLinesProperty);
private static void OnMaxLinesPropertyChangedCallback(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d is TextBlock textBlock)
{
if (textBlock.IsLoaded)
{
SetLineHeight();
}
else
{
textBlock.Loaded += OnLoaded;
void OnLoaded(object _, RoutedEventArgs __)
{
textBlock.Loaded -= OnLoaded;
SetLineHeight();
}
}
void SetLineHeight()
{
double lineHeight =
double.IsNaN(textBlock.LineHeight)
? textBlock.FontFamily.LineSpacing * textBlock.FontSize
: textBlock.LineHeight;
textBlock.MaxHeight = Math.Ceiling(lineHeight * GetMaxLines(textBlock));
}
}
}
}
デフォルトでは、LineHeight
は に設定されてdouble.NaN
いるため、この値は最初に手動で設定する必要があります。それ以外の場合、高さは の と から計算されFontFamily
ます。FontSize
TextBlock
添付プロパティMaxLines
とその他の関連プロパティは、次のように設定できます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>