2012-02-08 32 views
12

Debe haber una solución elegante a este problema, pero no puedo encontrar nada en línea. Tengo una grilla que tiene una columna y una fila con ancho/alto *, que contiene un ListBox. Tengo Window SizeToContents configurado en WidthAndHeight para permitir que la ventana cambie de tamaño al tamaño adecuado para cada conjunto de widgets/fuentes de IU. Cuando agrego elementos al ListBox, cambia el tamaño, lo que hace que la ventana crezca.Obtener ListBox para cambiar el tamaño con la ventana, pero no cambiar el tamaño del contenido

Quiero que el ListBox cambie de tamaño si cambio el tamaño de la ventana, pero si agrego contenido que es más largo que el ancho del ListBox, quiero que aparezca la barra de desplazamiento y no que crezca, lo que provoca crecer. Si configuro tamaños explícitos para la Ventana y configuro SizeToContent en Manual (el valor predeterminado), funciona como me propongo.

¿Hay alguna manera de ajustar el tamaño de la ventana a los contenidos al inicio y seguir haciendo que el ListBox crezca con el tamaño de la ventana, pero no con su contenido?

+3

tienen el mismo problema, pero dentro de una cuadrícula con la altura ajustable a través de un GridSplitter. Agregar elementos al cuadro de lista hace crecer el cuadro de lista y mueve el divisor de grillas en lugar de desplazarse. –

Respuesta

0

Para hacer ListBox para cambiar el tamaño cuando se cambia el tamaño de la ventana sólo tiene que utilizar:

<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" .../> 

Para permitir el desplazamiento en el cuadro de lista se puede encontrar una respuesta aquí porque la plantilla predeterminada del cuadro de lista incluye un ScrollViewer.

How can I get a vertical scrollbar in my ListBox?

1

Este es el comportamiento previsto el resultado de establecer la propiedad SizeToContent a WidthAndHeight como described here.

Lo que puede hacer es vincular el ancho y la altura del ListBox a las propiedades ActualWidth y ActualHeight de su contenedor, o usar un convertidor y vincularlos directamente a las propiedades respectivas de la ventana.

2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

0

espero que tenga el requisito de abajo, 1) ListBox debe hacer uso de la barra de desplazamiento que el tamaño de su contenido crece más grande que su estado original.

2) Si se cambia el tamaño de la ventana, ListBox debería crecer/contraerse junto con la ventana.

que han intentado lo mismo con un ejemplo sencillo, por favor verifica esto y si es diferente de sus necesidades, que me haga saber,

código

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <TextBlock Text="I am in Main Grid"/> 
     <ListBox Grid.Row="1" BorderBrush="BlueViolet" BorderThickness="5" Margin="10"> 
      <TextBlock Text="I am a ListBox"/> 
      <Button Content="Add Height and Width of ListBox by 100 pixels" Click="Button_Click"/> 
      <ListBoxItem Content="ListBoxItem" Background="AliceBlue" Margin="10" BorderBrush="Blue" Width="{Binding ListBoxWidth}" Height="{Binding ListBoxHeight}"/> 
     </ListBox> 
    </Grid> 
</Window> 

código C#:

public partial class MainWindow : Window,INotifyPropertyChanged 
{ 
    private int m_ListBoxWidth = 350; 

    public int ListBoxWidth 
    { 
     get { return m_ListBoxWidth; } 
     set 
     { 
      m_ListBoxWidth = value; 
      OnPropertyChanged("ListBoxWidth"); 
     } 
    } 

    private int m_ListBoxHeight = 150; 

    public int ListBoxHeight 
    { 
     get { return m_ListBoxHeight; } 
     set 
     { 
      m_ListBoxHeight = value; 
      OnPropertyChanged("ListBoxHeight"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ListBoxWidth += 190; 
     ListBoxHeight += 140; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
1

Siguiendo la sugerencia de Potecaru Tudor, resolví un problema similar envolviendo el ListBox en otro contenedor y vinculando la Altura del ListBox a la Altura real del contenedor.

Aquí es un fragmento de código XAML para ayudar:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Border x:Name="HeightHelperPanel" Grid.Row="0"> 
     <ListBox ItemsSource="{Binding Path=FileNameCollection}" 
       MinHeight="60" 
       Height="{Binding Path=ActualHeight, ElementName=HeightHelperPanel}"/> 
    </Border> 
</Grid> 

Básicamente, el contenedor de la frontera no crece cuando su contenido crece, pero se mantendrá estirado a la altura de la fila de la cuadrícula. La fila de la grilla llenará cualquier espacio que la ventana contenedora lo permita, pero no querrá forzar ninguna restricción de altura en la ventana. Por lo tanto, la altura del ListBox está restringida a la altura del borde.

Espero que ayude a cualquier otra persona que haya tenido este problema algo frustrante.

Cuestiones relacionadas