次の設定のTextBlock
があります。
TextWrapping="Wrap"
行の最大数を決定できますか?
たとえば、次の文字列TextBlock.Text
を考えてみます。
This is a very good horse under the blackboard!!
現在、次のように表示されています。
This is a very
good horse under
the blackboard!!
私はそれが次のようなものになるために必要です:
This is a very
good horse ...
解決策はありますか?
UWPアプリではこれは必要なく、TextBlockプロパティMaxLines
を使用できます( [〜#〜] msdn [〜#〜] を参照)
特定のLineHeight
がある場合、TextBlockの最大高さを計算できます。
最大3行のTextBlock
_<TextBlock
Width="300"
TextWrapping="Wrap"
TextTrimming="WordEllipsis"
FontSize="24"
LineStackingStrategy="BlockLineHeight"
LineHeight="28"
MaxHeight="84">YOUR TEXT</TextBlock>
_
これが要件を機能させるために必要なすべてです。
TextBlock
を拡張するC#/ VB.NETで新しいコントロールを作成し、それに新しいDependencyProperty
int MaxLinesを与えます。
次に、OnApplyTemplate()
メソッドをオーバーライドし、MaxHeight
* LineHeight
に基づいてMaxLines
を設定します。
これは、この問題を解決する方法についての基本的な説明にすぎません。
Height
、TextWrapping
、およびTextTrimming
がすべて設定されている場合は、期待どおりに動作します。
<TextBlock Height="60" FontSize="22" FontWeight="Thin"
TextWrapping="Wrap" TextTrimming="CharacterEllipsis">
上記のコードは最大2行まで折り返し、そのポイントを超えてCharacterEllipsis
を使用します。
Tobi.atとgtの答えに基づいて、私はこのMaxLines
動作を作成しました。重要なのは、フォントから行の高さを計算することによるLineHeight
プロパティの設定に依存しないことです。 TextWrapping
を希望どおりにレンダリングするには、TextTrimming
とTextBox
を設定する必要があります。
<TextBlock behaviours:NumLinesBehaviour.MaxLines="3" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" Text="Some text here"/>
行数を設定するMinLines
動作とは異なる、または同じ番号に設定できるMaxLines
動作もあります。
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;
}
}
TextBlock
にTextTrimming="WordEllipsis"
設定が必要です
UWPまたはWinRTアプリケーションを開発している人のために、TextBlock
には MaxLines
プロパティを設定できます。
@artistandsocialの回答に基づいて、プログラムで行の最大数を設定する添付プロパティを作成しました(WPFでは推奨されないTextBlock
をオーバーロードする必要はありません)。
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);
}
}
}
デフォルトでは、LineHeight
はdouble.NaN
に設定されているため、この値は最初に手動で設定する必要があります。
添付されたプロパティ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>