2008-12-29 23 views
88

Tengo un cuadro de lista WPF que muestra mensajes. Contiene un avatar en el lado izquierdo y el nombre de usuario y el mensaje apilados verticalmente a la derecha del avatar. El diseño está bien hasta que el texto del mensaje se ajuste a la palabra, pero en su lugar aparece una barra de desplazamiento horizontal en el cuadro de lista.Force TextBlock para ajustar en WPF ListBox

Busqué en Google y encontré soluciones a problemas similares, pero ninguno funcionó.

<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding Path=FriendsTimeline}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <Border BorderBrush="DarkBlue" BorderThickness="3" CornerRadius="2" Margin="3" > 
        <Image Height="32" Width="32" Source="{Binding Path=User.ProfileImageUrl}"/> 
       </Border> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Text="{Binding Path=User.UserName}"/> 
        <TextBlock Text="{Binding Path=Text}" TextWrapping="WrapWithOverflow"/> <!-- This is the textblock I'm having issues with. --> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Respuesta

120

El contenido del TextBlock se puede envolver con la propiedad TextWrapping. En lugar de StackPanel, use DockPanel/Grid. Una cosa más: establecer la propiedad ScrollViewer.HorizontalScrollBarVisibility en Disabled valor para ListBox.

Actualizado Hidden a Disabled basado en el comentario de Matt. Gracias Matt.

+36

Creo que debes establecer ScrollViewer.HorizontalScrollBarVisibility en "Disabled" en lugar de "Hidden"; de lo contrario, ListBox intentará desplazarte horizontalmente. simplemente no verá la barra de desplazamiento. –

8

El problema podría no estar ubicado en el ListBox. TextBlock no se ajustará, si uno de los controles principales proporciona suficiente espacio, para que no tenga la necesidad de ajustarlo. Esto podría ser causado por un control ScrollViewer.

+0

Gracias! en mi caso, deshabilitar el desplazamiento horizontal en la vista de lista solucionó el problema ScrollViewer.HorizontalScrollBarVisibility = "Disabled" – Ateik

0

Si desea evitar que TextBlock crezca, y desea que solo se ajuste al tamaño del cuadro de lista, debe establecer el ancho de forma explícita.

Para cambiarlo dinámicamente, significa que no es un valor fijo, pero debe vincularlo a su elemento principal apropiado en el árbol visual. Puede tener algo como esto:

<ListBox ItemsSource="{Binding MyItems}" Name="MyListBox"> 

    <ListBox.Resources> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Width" 
       Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ScrollContentPresenter}, Path=ActualWidth}" /> 
    </Style> 
    </ListBox.Resources> 

    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Title}" TextWrapping="Wrap" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 

</ListBox> 

Si esto no funciona, trate de encontrar los elementos adecuados (que tiene que ser encuadernados a lo) con el árbol visual en vivo en Visual Studio.