我需要一個具有TextTrimming和MaxLines的TextBlock或TextBox。 TextBlock具有TextTrimming屬性,TextBox具有MaxLines屬性,但都不支持兩者。這是允許用戶輸入筆記並將其顯示在列表框中的更大控件的一部分(如果感興趣,請參閱:Grief with WPF UserControl with ListBox and TextBox Can't get textwrapping to work)。基本上,對於已經輸入的筆記,我想限制筆記2行。如果它比2行更長,我會在它的結尾顯示一個橢圓(...),以指示註釋中還有更多內容。如果用戶將鼠標懸停在縮略圖上,則他/她會將整個筆記看作是彈出式窗口。*控件將放在主網格上,並且可能會有不同的大小(或調整大小),因此2行中的文本數量可能會發生變化。即在某些情況下可以完全顯示的註釋可能最終會在其他情況下縮寫。需要帶TextTrimming和MaxLines的WPF TextBlock或TextBox
嘗試將MaxLines功能添加到TextBlock,還是將TextTrimming添加到TextBox會更好嗎?我看到一些貼近我需要做的事情。下面是一個將TextTrimming添加到TextBox但僅在編輯時才確定MaxLines仍然有效的問題:TextBox TextTrimming 我沒有遇到任何有關將MaxLines屬性添加到TextBlock的問題。請注意,Windows手機的TextBlock似乎有它。也許我不是唯一一個需要這個:)
我有點驚訝,這是不可用「開箱即用」。這似乎是一個普遍的問題。順便說一下,TextBox,TextBlock,甚至標籤或其他東西都沒有優先權。這些只是ListBox項目,不可編輯。
任何想法或指針非常讚賞。如果你在想,「他可能會問下一個問題,當用戶將鼠標懸停在縮略圖上時,如何顯示一個彈出框」,那麼你是非常正確的!
這裏有一個方法來處理基於這個stackoverflow後的問題: Scrollable TextBlock Sized EXACTLY 2 Lines High 查看回答Joel B Fant。關鍵的想法是另一個不可見的TextBlock(下面稱爲「限制器」),有2行(或任何你想要的)。然後,將文本塊的Height屬性綁定到dummy「limier」文本塊的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>
謝謝Sheridan的快速反應。我想過使用Height屬性(或MaxHeight),也許這是我將要去的方式,但是如果字體不是我所期望的,我想我會遇到問題,因爲這是一個用戶控件,我將不知道正在使用什麼字體。請參閱:http://stackoverflow.com/questions/5971373/scrollable-textblock-sized-exactly-2-lines-high – Dave
然後你可以[覆蓋'PropertyMetaData'](http://msdn.microsoft.com/en -us/library/ms754209(v = vs.110).aspx)爲UserControl.FontProperty DependencyProperty添加一個PropertyChangedCallback處理程序,它可以在每次更改時根據新的FontFamily值測量文本高度。 – Sheridan
謝謝謝里登。我從你最初的答案中提出了「高度」的概念,然後與之一起運行。我沒有像你所建議的那樣做事。我改爲在Joel B Fant的答案中,在http://stackoverflow.com/questions/5971373/scrollable-textblock-sized-exactly-2-lines-high,他使用「虛擬」文本塊來設置高度。我在我原來的問題中增加了細節。我將你的答案標記爲答案,因爲它給了我一個解決方案的火花和途徑。非常感謝! – Dave