31

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 ...

解決策はありますか?

4

7 に答える 7

52

更新 (UWP 用)

UWP アプリではこれは必要なく、TextBlock プロパティを使用できますMaxLines( MSDNを参照) 。


元の回答:

特定のものがある場合は、TextBlockの最大の高さLineHeightを計算できます。

例:

最大 3 行の TextBlock

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

要件を機能させるために必要なのはこれだけです。

これを動的に行う方法は?

TextBlock拡張して新しいDependencyProperty int MaxLinesを与えるC#/VB.NET で新しいコントロールを作成するだけです。 次に、メソッドを
オーバーライドし、 *に基づいてを設定します。OnApplyTemplate()MaxHeightLineHeightMaxLines

これは、この問題を解決する方法についての基本的な説明です。

于 2013-11-19T19:53:09.997 に答える
5

HeightTextWrapping、およびすべてが設定されている場合TextTrimming、希望どおりに動作します。

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

上記のコードは 2 行まで折り返され、それCharacterEllipsis以降は使用されます。

于 2014-10-21T19:38:51.470 に答える
2

TextTrimming="WordEllipsis"あなたはあなたの設定が必要ですTextBlock

于 2012-11-30T02:09:45.257 に答える
1

@artistandsocialの回答に基づいて、添付プロパティを作成して、プログラムで最大行数を設定しました(TextBlockWPFで推奨されていないオーバーロードを行うのではなく)。

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ます。FontSizeTextBlock

添付プロパティ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>
于 2016-04-15T12:45:55.590 に答える
-4

私はそれが設定可能であることを疑っています.Wrappingは、フォントサイズ/カーニング、テキストブロックの利用可能な幅(horizo​​ntalalignment=stretchは大きな違いを生む可能性があります)、親のパネルタイプ(scrollviewer/stackpanel/grid)などの多くの要因に基づいています.

テキストを明示的に次の行に流したい場合は、代わりに「実行」ブロックを使用し、その実行ブロックに省略記号のラップを使用する必要があります。

于 2012-11-30T02:12:22.643 に答える