我需要一个具有TextTrimming和MaxLines的TextBlock或TextBox。TextBlock具有TextTrimming属性,而TextBox具有MaxLines属性,但两者均不支持。这是较大的控件的一部分,该控件允许用户输入注释并将其显示在ListBox中(请参阅:使用WPF的悲伤用户列表和TextBox的UserControl无法使文本包装工作如果有兴趣)。基本上,对于已经输入的注释,我想将注释限制为2行。如果长度超过2行,我会在其末尾显示一个椭圆(...),以指示该注释还有更多内容。如果用户将鼠标悬停在缩略的便笺上,他/她将看到整个便笺作为弹出窗口。*控件将放置在主网格上,并且大小可能不同(或调整了大小),因此2行中的文本量可能会发生变化。即,在某些情况下可以完全显示的注释可能在其他情况下最终被缩写。
尝试将MaxLines功能添加到TextBlock或将TextTrimming添加到TextBox会更好吗?我看到一些帖子似乎与我需要做的很接近。这是一个将TextTrimming添加到TextBox的方法,但是仅在编辑时才可以使用,并且不清楚MaxLines是否仍然有效:TextBox TextTrimming我没有遇到任何有关将MaxLines属性添加到TextBlock的事情。请注意,Windows Phone的TextBlock似乎拥有它。也许我不是唯一需要这个的人:)
令我有些惊讶的是,它“开箱即用”时不可用。这似乎是一个普遍的问题。顺便说一句,对于TextBox,TextBlock甚至是Label或其他东西,没有任何偏好。这些只是ListBox项,并且不可编辑。
任何想法或指针,将不胜感激。
-Dave *如果您正在考虑,“他可能接下来要问用户将鼠标悬停在缩写音符上时如何显示弹出窗口”,您是非常正确的!
这是一种基于此stackoverflow帖子的解决问题的方法:Scrollable TextBlock大小精确为2行高请参阅Joel B Fant的回答。关键思想是另一个不可见的TextBlock(以下称为“限制器”),具有2行(或您想要的任何内容)。然后,将文本块的Height属性绑定到虚拟“更高级”文本块的ActualHeight。这是我的XAML外观,它似乎可以正常工作:
<UserControl x:Class="MyControlsLibrary.Views.NotesControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<DataTemplate x:Key="DefaultTemplate">
<Grid x:Name="GridItem" >
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ScrollViewer Margin="0,5,5,0" MaxHeight="{Binding ElementName=limiter,Path=ActualHeight}" HorizontalAlignment="Stretch" VerticalAlignment="Top" VerticalScrollBarVisibility="Hidden">
<TextBlock x:Name="NoteText" Grid.Column="0" Height="{Binding ElementName=limiter,Path=ActualHeight}" Text="{Binding Path=NoteText}" TextTrimming="WordEllipsis" TextWrapping="Wrap">
<TextBlock.ToolTip>
<TextBlock Text="{Binding Path=NoteText}" TextWrapping="Wrap"></TextBlock>
</TextBlock.ToolTip>
</TextBlock>
</ScrollViewer>
<TextBlock x:Name="limiter" Grid.Column="0" Margin="0,5,5,0" Visibility="Hidden" HorizontalAlignment="Left" Width="10" VerticalAlignment="Top">
a <LineBreak/> b
</TextBlock>
</Grid>
</DataTemplate>
</UserControl.Resources>
<Grid Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox TextWrapping="Wrap" Grid.Row="0" Text="{Binding Path=NewNoteText, UpdateSourceTrigger=PropertyChanged}" LostFocus="TextBox_LostFocus" AcceptsReturn="True">
<TextBox.InputBindings>
<KeyBinding Command="{Binding Path=AddNote}" Key="Enter"/>
</TextBox.InputBindings>
</TextBox>
<ListBox
ScrollViewer.HorizontalScrollBarVisibility="Disabled" Grid.Row="1" ItemsSource="{Binding Path=Notes}" Margin="5" ItemTemplate="{DynamicResource DefaultTemplate}" SelectionChanged="NotesControl_SelectionChanged">
</ListBox>
</Grid>
您可以从默认值获得该功能TextBlock
。除了使用该MaxLines
属性外,您还可以使用普通的旧Height
属性。这是一个非常简单的示例:
<TextBlock Text="This is some very important note which just happens to be quite long"
Height="38" Width="150" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" />
请记住,我仅在Width
此处设置以向您显示带有省略号的两行文本。在您的项目中,应Grid
设置一个为Width
。
当然,您不能将其用于文本输入,因此,如果您有兴趣,可以从Code Project上的“TextBox
带省略号的WPF文本框”页面下载带省略号的a 。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句