我试图创建一个带有两个TextBlock>
s的控件,其中包含“显示更多”和“显示更多” “显示更少”功能。考虑初始阈值X
,如果TextBlock
的高度大于Threshdold,则TextBlock
将调整为阈值的值(折叠直到达到该值)。再次单击,会将TextBlock
展开为 MaxHeight="Auto"
。
这是我到目前为止所尝试的内容:
<StackPanel>
<TextBlock x:Name="ResizeableTextBlock"
Text="{Binding Description}"
TextWrapping="Wrap" MaxHeight="{Binding ResizeThreshold}"/>
<TextBlock Text="{Binding ResizeLabel}"
Foreground="{StaticResource PhoneAccentBrush}"
Tapped="OnResizeLabelTapped"/>
</StackPanel>
并且Tapped
事件处理程序如下所示:
private void OnResizeLabelTapped(object sender, TappedRoutedEventArgs e)
{
if (ResizeableTextBlock.ActualHeight > viewModel.ResizeThreshold)
{
ResizeableTextBlock.MaxHeight = ResizeThreshold;
ResizeLabel = ShowLessLabel;
}
else if (ResizeableTextBlock.ActualHeight < viewModel.ResizeThreshold)
{
ResizeableTextBlock.ClearValue(MaxHeightProperty);
ResizeLabel = ShowMoreLabel;
}
}
此方法的问题在于,元素的ActualHeight
很可能与最初分配给元素的Height
略有不同。
例如,设置Height = 200
,然后查询ActualHeight
值会产生类似于201.00747494...
的值,因为系统和布局都会进行所有计算。
关于更可靠方法的任何想法?
P.S。还有一个很好的属性MaxLines
,它提供了我所需要的,但是使用这条路径并不是很有帮助,因为我仍然需要首先确定是否必须应用“Show More”或“show Less”。 .. MaxLines
只是一个制定者,没有类似“CurrentLines”的吸气剂可供比较。