2012-02-08 8 views
12

Ci deve essere una soluzione elegante a questo problema, ma non riesco a trovare nulla online. Ho una griglia che ha una colonna e una riga con larghezza/altezza *, contenente un ListBox. Ho il mio Window SizeToContents impostato su WidthAndHeight per consentire alla finestra di ridimensionare alla dimensione corretta per ogni set di widget/font dell'interfaccia utente. Quando aggiungo elementi al ListBox, si ridimensiona, facendo sì che la finestra cresca.Ottieni ListBox per ridimensionare con finestra, ma non ridimensionare con contenuto

Voglio ridimensionare la ListBox se cambio la dimensione della finestra, ma se aggiungo contenuto più lungo della larghezza del ListBox, voglio che la barra di scorrimento appaia e non che cresca, causando la finestra crescere. Se imposto dimensioni esplicite per la finestra e imposta SizeToContent su Manual (il valore predefinito), funziona come intendo.

C'è un modo per ridimensionare la finestra dei contenuti all'avvio e continuare ad aumentare la ListBox con le dimensioni della finestra, ma non con il suo contenuto?

+3

hanno lo stesso problema, ma all'interno di una griglia con l'altezza regolabile tramite un GridSplitter. L'aggiunta di elementi alla casella di riepilogo aumenta la casella di riepilogo e sposta il gridsplitter anziché scorrere. –

risposta

0

Per rendere ListBox per ridimensionare quando si modifica la dimensione della finestra basta usare:

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

Per attivare lo scorrimento nel vostro ListBox si può trovare una risposta qui perché il modello predefinito del ListBox includono uno ScrollViewer.

How can I get a vertical scrollbar in my ListBox?

1

Questo è il comportamento previsto provocato dal impostando la proprietà SizeToContent a WidthAndHeight come described here.

Ciò che si potrebbe fare è legare la larghezza e l'altezza del ListBox alle proprietà ActualWidth e ActualHeight del suo contenitore, oppure utilizzare un convertitore e collegarli direttamente alle rispettive proprietà della finestra.

2

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

0

Spero che tu abbia l'esigenza di seguito, 1) ListBox dovrebbe fare uso di barra di scorrimento è formato del suo contenuto diventa più grande rispetto al suo originale.

2) Se la finestra viene ridimensionata, ListBox dovrebbe crescere/restringersi con Finestra.

ho provato lo stesso con un semplice esempio, si prega di controllare questo e se diversa dalla vostra esigenza, fatemelo sapere,

codice

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> 

codice 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

Seguendo il suggerimento di Potecaru Tudor, ho risolto un problema simile avvolgendo il ListBox in un altro contenitore e legando l'altezza del ListBox a ActualHeight del contenitore.

Qui è un frammento di codice XAML per aiutare:

<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> 

Sostanzialmente, il contenitore Border non cresce quando il suo contenuto cresce, ma rimarrà allungato per l'altezza della riga della griglia. La riga della griglia riempirà qualsiasi spazio la finestra di contenimento lo consenta, ma non vorrà forzare alcun vincolo di altezza sulla finestra. L'altezza del ListBox è quindi vincolata all'altezza del bordo.

La speranza che aiuta chiunque abbia avuto questo problema un po 'frustrante.

Problemi correlati