2014-02-19 2 views
2

Мне нужен 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> 

ответ

4

Вы можете получить эту функциональность от стандартного 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" /> 

enter image description here

Имейте в виду, что я только установить Width здесь, чтобы показать вам две строки текста, показанных с символ многоточия. В вашем проекте вы должны установить Grid его Width.

Конечно, вы не можете использовать это для ввода текста, так что если вы заинтересованы, то вы можете скачать TextBoxс многоточия из WPF TextBox With Ellipsis страницы по проекту Кодекса.

+0

Спасибо за быстрый ответ Шеридан.Я думал об использовании свойства Height (или MaxHeight), и, возможно, так я и поеду, но я думаю, что у меня будут проблемы, если шрифт не то, что я ожидаю, и поскольку это пользовательский элемент управления, я не будут знать, какие шрифты используются. См. Http://stackoverflow.com/questions/5971373/scrollable-textblock-size-exactly-2-lines-high – Dave

+0

Затем вы можете [переопределить 'PropertyMetaData'] (http://msdn.microsoft.com/ru -us/library/ms754209 (v = vs.110) .aspx) для 'UserControl.FontProperty DependencyProperty' для добавления обработчика PropertyChangedCallback, который может измерять высоту текста, зависящую от нового значения FontFamily, каждый раз, когда он изменяется , – Sheridan

+0

Спасибо, Шеридан. Я принял вас за идею «Высота» от вашего первоначального ответа и побежал с ней. Я не делал таких вещей, как вы предлагали. Вместо этого я отскакивал от ответа Джоэля Б Фанта в http://stackoverflow.com/questions/5971373/scrollable-textblock-sized-exactly-2-lines-high, где он использовал «фиктивный» текстовый блок для установки высоты. Я добавил детали к моему оригинальному вопросу. Я отмечаю ваш ответ как ответ, поскольку он дал мне искру и путь к решению. Большое спасибо! – Dave

Смежные вопросы