2010-05-21 5 views
2

Вот что я хочу: A ListBox, чьи вещи состоят из StackPanel с двумя TextBlock s. Текстовым блокам необходимо поддерживать упаковку, список не должен расширяться, и не должно быть горизонтальной полосы прокрутки. Вот код, который у меня есть. Скопируйте и вставьте его в XAMLPad, и вы увидите, что я говорю о:WPF Textblock в Listbox не обрезается должным образом

<ListBox Height="300" Width="300" x:Name="tvShows"> 
    <ListBox.Items> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ElementName=tvShows, Path=ActualWidth}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 

Это, кажется, делает работу по поддержанию TextBlocks расти, но есть одна проблема. Текстовые блоки кажутся немного большими, чем список, в результате чего появляется горизонтальная полоса прокрутки. Это странно, потому что их ширина привязана к ActualWidth lisbox. Кроме того, если вы добавите еще несколько элементов в список (просто вырезаем и вставляем в XamlPad), в результате чего появляется вертикальная полоса прокрутки, ширина текстовых блоков не изменяется на вертикальную полосу прокрутки.

Как сохранить TextBlock s внутри ListBox с вертикальной полосой прокрутки или без нее?

+0

Очень хороший вопрос. Я склонен думать, что это ошибка в текстовом блоке WPF. – bitbonk

ответ

3

Есть два способа сделать это, но я думаю, что вы действительно хотите, чтобы отключить горизонтальную полосу прокрутки, которая производится с прикрепленным свойство:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
... 

Вы можете удалить привязки ширины на TextBlocks.

Другой вариант заключается в связывании с TextBlocks ширины к ScrollContentPresenter'sActualWidth через RelativeSource привязок:

<ListBox Height="300" Width="300" x:Name="tvShows" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
    <ListBox.Items> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
     <ListBoxItem> 
      <StackPanel> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
       <TextBlock Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ScrollContentPresenter}}}" TextWrapping="Wrap">Lost is an American live-action television series. It follows the lives of plane crash survivors on a mysterious tropical island.</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 
+0

Вторая работала отлично! Он работает, даже если я увеличиваю ширину полосы прокрутки с помощью настроек дисплея. Благодаря! –

0

Вы можете обойти эту проблему, как это:

<ListBox.Resources> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Margin" Value="0 0 -6 0" /> 
     <Setter Property="Padding" Value="0 0 6 0" /> 
    </Style> 
    </ListBox.Resources> 

Это может не сработать, если изменения FONTSIZE. Другой (и, вероятно, лучше) способ отключить полосу прокрутки полностью:

<ListBox x:Name="tvShows" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
Смежные вопросы