2009-12-30 13 views
18

Tengo un TextBlock dentro de un ScrollViewer que se alinea con estirar a su ventana. Necesito el TextBlock a comportarse como los siguientes:C# WPF - Problemas ScrollViewer + TextBlock

  • Cambia el tamaño de la ventana, no hay barras de desplazamiento
  • Cuando cambia de tamaño por debajo de cierto ancho de los TextBlock necesidades para mantener una MinWidth y barras de desplazamiento deben aparecer
  • TextWrapping o TextTrimming debería funcionar apropiadamente

¿Cómo puedo obtener esta funcionalidad?

He intentado de varias maneras, implicando enlaces a ActualWidth & ActualHeight, pero no puedo hacerlo funcionar.

Esto no puede ser tan difícil, ¿qué me estoy perdiendo?

Aquí es un ejemplo de código para poner en XamlPad (sin MinWidth está establecido aún):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
      <TextBlock TextWrapping="Wrap" Text="Some really long text that should probably wordwrap when you resize the window." /> 
    </ScrollViewer> 
</Window> 
+0

Aclaración: ¿está integrado el scrollviewer en la plantilla del control? ¿O es externo al control? –

+0

Puedes fingir que se parece a lo anterior. – jonathanpeppers

Respuesta

23

Esto funciona:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="Scroller"> 
      <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="100" Width="{Binding ElementName=Scroller, Path=ViewportWidth}" 
      TextWrapping="Wrap" Text="Some really long text that should probably wordwrap when you resize the window." /> 
    </ScrollViewer> 
</Window> 
+1

Sí, eso es de una manera, aunque puede hacer que el motor de diseño bucle varias veces en el árbol visual porque el enlace de ancho ocurre después del renderizado, lo que obliga a pasar otro diseño. –

+1

¿Hay alguna otra manera? – jonathanpeppers

+0

Sí, la forma correcta sería modificar la medida y organizar la lógica para el visor de desplazamiento, el bloque de texto o algún elemento personalizado entre ellos. Me he estado revolviendo el cerebro tratando de resolverlo desde que escribí ese comentario 'Estoy trabajando en eso' :) –

2

Sin mayor detalle, lo mejor que puedo hacer es proporcionarle la manera estándar de hacer esto. Básicamente, aloje su elemento (que tiene un tamaño mínimo) en un visor de desplazamiento; cuando el scrollviewer se redimensiona lo suficientemente pequeño como para que el elemento no pueda caber por completo dentro de él, se mostrarán automáticamente las barras de desplazamiento. Ejemplo:

<ScrollViewer> 
    <Button MinWidth="100" MinHeight="50"/> 
</ScrollViewer> 
+0

Hmm, esto funciona en XamlPad, pero no en mi aplicación. Tendré que hacer algunas excavaciones para descubrir por qué. – jonathanpeppers

+0

Es porque mi control es un TextBlock. Ver mi edición arriba. – jonathanpeppers

+0

¿Cuál es exactamente el comportamiento que estás tratando de lograr? Debería funcionar cuando configura 'MinWidth' y' MinHeight' en 'TextBlock' también. –

Cuestiones relacionadas