2016-08-02 8 views
0

Ich habe eine UWP-Anwendung, wo ich den Text der TextBlock trimmen möchte, wenn es über die dritte Zeile hinausgeht und "show more" Link (tappable) in der Ende der 3. Zeile.UWP: Trimmen des Textes eines TextBlocks basierend auf der Anzahl der Zeilen

Ich weiß, die Anzahl der Zeilen zu beschränken, die ich MaxLines Eigenschaft verwenden kann, aber es ignoriert einfach den Rest der Zeilen, als ob sie nicht existieren. Aber ich möchte den Benutzer wissen lassen, dass es noch mehr Text gibt, und er kann auf den Link anzeigen klicken, um zum Volltext zu navigieren.

Wie kann ich es erreichen?

Antwort

2

die good topic lesen, die alle Schritt beschreibt eine erweiterbare TextBlock-

auch zu schaffen, den Quellcode auf github

Hier wird der XAML-Code:

<Grid x:Name="LayoutRoot" Tapped="LayoutRoot_OnTap"> 
    <Grid.RowDefinitions> 
      <RowDefinition Height = "Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <TextBlock Grid.Row="0" 
        x:Name= "CommentTextBlock" 
        HorizontalAlignment= "Left" 
        TextWrapping= "Wrap" 
        Height= "Auto" 
        Width= "280" /> 

     < StackPanel Grid.Row= "1" 
        Orientation= "Horizontal" 
        HorizontalAlignment= "Right" 
        x:Name= "ExpandHint" 
        Visibility= "Collapsed" 
        Margin= "0,5,0,0" > 
      < TextBlock Text= "View More" /> 
      < TextBlock Margin= "10,0,10,0" 
     Text= "+" /> 
     </ StackPanel > 
</ Grid > 

Hier C# Teil

ist
public sealed partial class ExpandableTextBlock : UserControl 
{ 
    public ExpandableTextBlock() 
    { 
     this.InitializeComponent(); 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
     "Text", typeof(string), typeof(ExpandableTextBlock), new PropertyMetadata(default(string), OnTextChanged)); 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var ctl = (ExpandableTextBlock)d; 
     ctl.CommentTextBlock.SetValue(TextBlock.TextProperty, (string)e.NewValue); 
     ctl.CommentTextBlock.SetValue(TextBlock.HeightProperty, Double.NaN); 

     ctl.CommentTextBlock.Measure(new Size(ctl.CommentTextBlock.Width, double.MaxValue)); 

     double desiredheight = ctl.CommentTextBlock.DesiredSize.Height; 
     ctl.CommentTextBlock.SetValue(TextBlock.HeightProperty, (double)63); 

     if (desiredheight > (double)ctl.CommentTextBlock.GetValue(TextBlock.HeightProperty)) 
     { 
      ctl.ExpandHint.SetValue(StackPanel.VisibilityProperty, Visibility.Visible); 
      ctl.MaxHeight = desiredheight; 
     } 
     else 
     { 
      ctl.ExpandHint.SetValue(StackPanel.VisibilityProperty, Visibility.Collapsed); 
     } 

     //Setting length of comments 
     var boundsWidth = Window.Current.Bounds.Width; 
     ctl.CommentTextBlock.SetValue(TextBlock.WidthProperty, boundsWidth); 
    } 

    public static readonly DependencyProperty CollapsedHeightProperty = DependencyProperty.Register(
     "CollapsedHeight", typeof(double), typeof(ExpandableTextBlock), new PropertyMetadata(default(double), OnCollapsedHeightChanged)); 


    public double CollapsedHeight 
    { 
     get { return (double)GetValue(CollapsedHeightProperty); } 
     set { SetValue(CollapsedHeightProperty, value); } 
    } 

    private static void OnCollapsedHeightChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var ctl = (ExpandableTextBlock)d; 
     ctl.CollapsedHeight = (double)e.NewValue; 
    } 


    public static readonly DependencyProperty TextStyleProperty = DependencyProperty.Register(
     "TextStyle", typeof(Style), typeof(ExpandableTextBlock), new PropertyMetadata(default(Style), OnTextStyleChanged)); 

    public Style TextStyle 
    { 
     get { return (Style)GetValue(TextStyleProperty); } 
     set { SetValue(TextStyleProperty, value); } 
    } 

    private static void OnTextStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var ctl = (ExpandableTextBlock)d; 
     ctl.CommentTextBlock.SetValue(StyleProperty, (Style)e.NewValue); 
    } 

    private void LayoutRoot_OnTap(object sender, TappedRoutedEventArgs tappedRoutedEventArgs) 
    { 
     if ((Visibility)this.ExpandHint.GetValue(StackPanel.VisibilityProperty) == Visibility.Visible) 
     { 
      //transition 
      this.CommentTextBlock.SetValue(TextBlock.HeightProperty, Double.NaN); 

      this.ExpandHint.SetValue(StackPanel.VisibilityProperty, Visibility.Collapsed); 
     } 
    } 
} 
+0

Ich werde es versuchen. Vielen Dank. – tavier

+0

Bitte poste die wesentlichen Teile hier falls der Link kaputt geht. Sie können die Links natürlich als Referenz behalten. – Bart

+0

@Bart aktualisiert den Beitrag –

Verwandte Themen