Мне нужен TextBlock или TextBox с TextTrimming и MaxLines. TextBlock имеет свойство TextTrimming, а TextBox имеет свойство MaxLines, но не поддерживает оба. Это часть более крупного элемента управления, позволяющего пользователю вводить заметки и отображать их в ListBox (см.: Grief with WPF UserControl with ListBox and TextBox Can't get textwrapping to work, если это интересно). В принципе, для уже введенных заметок я хотел бы ограничить заметку двумя строками. Если он длиннее 2 строк, я бы показал эллипс (...) в конце его, чтобы указать, что для заметки больше. Если пользователь навешивается над сокращенной записью, он/она увидит всю заметку как всплывающее окно. * Элемент управления будет помещен в основную сетку и может быть разных размеров (или изменен), поэтому количество текста в 2 строках может меняться , То есть примечание, которое может быть полностью отображено в некоторых ситуациях, может быть сокращено в других ситуациях.Нужен текстовый блок WPF или TextBox с TextTrimming и MaxLines
Было бы лучше попытаться добавить функциональность MaxLines в TextBlock или добавить TextTrimming в TextBox? Я видел несколько сообщений, которые кажутся близкими к тому, что мне нужно делать. Вот то, что добавляет TextTrimming в TextBox, но только при редактировании, и неясно, работает ли MaxLines: TextBox TextTrimming Мне ничего не удалось добавить о добавлении свойства MaxLines в TextBlock. Обратите внимание, что TextBlock для телефонов Windows, похоже, есть. Возможно, я не единственный, кому это нужно :)
Я немного удивлен, что это невозможно «прямо из коробки». Казалось бы, это общая проблема. Кстати, нет предпочтений в отношении TextBox, TextBlock или даже метки или чего-то еще. Это только элементы ListBox и НЕ редактируются.
Любые идеи или указатели очень ценятся.
-Dave * Если вы думаете, «он, вероятно, собирается спросить, как отображать всплывающее окно, когда пользователь наводит курсор на сокращенную ноту», вы совершенно правы!
Вот способ справиться с проблемой, основанной на этом сообщении stackoverflow: Scrollable TextBlock Sized EXACTLY 2 Lines High См. Ответ Joel B Fant. Ключевой идеей является еще один невидимый TextBlock (называемый «лимитер» ниже) с 2 строками (или тем, что вы хотите). Затем вы привязываете свойство Height вашего текстового блока к ActualHeight манекена «limier» textblock. Вот что мой 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>
Спасибо за быстрый ответ Шеридан.Я думал об использовании свойства Height (или MaxHeight), и, возможно, так я и поеду, но я думаю, что у меня будут проблемы, если шрифт не то, что я ожидаю, и поскольку это пользовательский элемент управления, я не будут знать, какие шрифты используются. См. Http://stackoverflow.com/questions/5971373/scrollable-textblock-size-exactly-2-lines-high – Dave
Затем вы можете [переопределить 'PropertyMetaData'] (http://msdn.microsoft.com/ru -us/library/ms754209 (v = vs.110) .aspx) для 'UserControl.FontProperty DependencyProperty' для добавления обработчика PropertyChangedCallback, который может измерять высоту текста, зависящую от нового значения FontFamily, каждый раз, когда он изменяется , – Sheridan
Спасибо, Шеридан. Я принял вас за идею «Высота» от вашего первоначального ответа и побежал с ней. Я не делал таких вещей, как вы предлагали. Вместо этого я отскакивал от ответа Джоэля Б Фанта в http://stackoverflow.com/questions/5971373/scrollable-textblock-sized-exactly-2-lines-high, где он использовал «фиктивный» текстовый блок для установки высоты. Я добавил детали к моему оригинальному вопросу. Я отмечаю ваш ответ как ответ, поскольку он дал мне искру и путь к решению. Большое спасибо! – Dave