2017-03-06 4 views
1

In einem WPF-Projekt habe ich eine Grid definiert mit zwei Reihen mit jeweils einem ListBox enthält. Die RowDefinition s haben ihre Height = '*' so gleich viel Raum für jeden ListBox zugeordnet ist. Was ich möchte, aber passieren, ist, dass, wenn entweder ListBox nicht vollständig ist ganz eigenen Platz benötigen (durch die Elemente zur Laufzeit entfernt wird), dann, dass ‚Reserve‘ Raum ist mit dem anderen ListBox übergeben.WPF Grid Layout-Abfrage

Also, mit dem Code, den ich unten Liste, die beide ListBox ‚s mit dem gleichen Raum beginnen, die richtige ist. Durch Drücken der Taste werden einige Einträge aus der obersten ListBox (topList) gelöscht, was zu Leerraum unter den verbleibenden 2 Einträgen führt. Es ist dieser Raum, den ich am unteren ListBox gewährt werden möchte. Und umgekehrt. Hoffe, das macht Sinn.

Kann mir jemand helfen mit, wie ich das erreichen könnte?

Vielen Dank im Voraus für jede Hilfe.

XAML:

<Window x:Class="FiftyPercentSplit.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:FiftyPercentSplit" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid Height="200"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <Button x:Name="btnDeleteFromTopList" Click="btnDeleteFromTopList_Click" Content="Delete from Top List"/> 

    <ListBox x:Name="topList" Grid.Row="1"> 
     <ListBoxItem>1</ListBoxItem> 
     <ListBoxItem>2</ListBoxItem> 
     <ListBoxItem>3</ListBoxItem> 
     <ListBoxItem>4</ListBoxItem> 
     <ListBoxItem>5</ListBoxItem> 
     <ListBoxItem>6</ListBoxItem> 
     <ListBoxItem>7</ListBoxItem> 
     <ListBoxItem>8</ListBoxItem> 
     <ListBoxItem>9</ListBoxItem> 
    </ListBox> 

    <ListBox x:Name="bottomList" Grid.Row="2"> 
     <ListBoxItem>1</ListBoxItem> 
     <ListBoxItem>2</ListBoxItem> 
     <ListBoxItem>3</ListBoxItem> 
     <ListBoxItem>4</ListBoxItem> 
     <ListBoxItem>5</ListBoxItem> 
     <ListBoxItem>6</ListBoxItem> 
     <ListBoxItem>7</ListBoxItem> 
     <ListBoxItem>8</ListBoxItem> 
     <ListBoxItem>9</ListBoxItem> 
    </ListBox> 

</Grid> 

Code hinter:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void btnDeleteFromTopList_Click(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 7; i++) 
     { 
      topList.Items.RemoveAt(0); 
     } 
    } 
} 
+0

Antwort zu vermeiden und wenn Sie anschließend Elemente aus der unteren Liste entfernen, sollte alles zufällt zurück zu gleichen Größen? Das ist kaum möglich ohne einen Code hinter Magie. – Clemens

+0

@Cleve, hast du den Ansatz versucht, den ich in meiner Antwort vorgeschlagen habe? Funktioniert es für Sie? – ASh

+0

Hi @ASh, es tut mir leid, dass ich nicht früher geantwortet habe. Ja, ich habe es versucht und es hat super funktioniert. Mir hat der 'Meurer' Trick wirklich gefallen. Vielen Dank! – Cleve

Antwort

1

effektiv die zweite Zeile sollte als Auto -height Reihe verhalten. Scrollbare Steuerelemente wie ListBox funktionieren jedoch nicht gut in Auto -Höhe Reihe - sie wachsen unendlich und zeigen nicht Scroll. Um es zu überwinden, muss ich normalerweise MaxHeight setzen.

In diesem Fall links I 2 RowDefinitions mit Height = „*“ verwendet Element mit dem Namen Measurer tatsächliche Höhe der Zeilen zu erhalten und die MaxHeight für topList von ActualHeight von Vermesser eingestellt. Beachten Sie auch, dass ich ein verschachteltes Gitter verwendet mit <RowDefinition Height="Auto"/>

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <Button x:Name="btnDeleteFromTopList" Click="btnDeleteFromTopList_Click" Content="Del"/> 

    <Border Grid.Row="2" Name="Measurer"/> 

    <Grid Grid.Row="1" Grid.RowSpan="2"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <ListBox Grid.Row="0" x:Name="topList" VerticalAlignment="Top" 
        MaxHeight="{Binding ActualHeight, ElementName=Measurer}"> 

     </ListBox> 

     <ListBox x:Name="bottomList" Grid.Row="1"> 

     </ListBox> 
    </Grid>  
</Grid> 
  • ListBoxItems aus der Probe entfernt, um Code Unordnung in der
0

Nur Stackpanel anstelle von Grid wie folgt aus:

<Window x:Class="WpfApplication2.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
Title="MainWindow" Height="350" Width="525"> 
<StackPanel Height="200"> 

    <Button x:Name="btnDeleteFromTopList" Click="btnDeleteFromTopList_Click" Content="Delete from Top List"/> 

    <ListBox x:Name="topList" Grid.Row="1"> 
     <ListBoxItem>1</ListBoxItem> 
     <ListBoxItem>2</ListBoxItem> 
     <ListBoxItem>3</ListBoxItem> 
     <ListBoxItem>4</ListBoxItem> 
     <ListBoxItem>5</ListBoxItem> 
     <ListBoxItem>6</ListBoxItem> 
     <ListBoxItem>7</ListBoxItem> 
     <ListBoxItem>8</ListBoxItem> 
     <ListBoxItem>9</ListBoxItem> 
    </ListBox> 

    <ListBox x:Name="bottomList" Grid.Row="2"> 
     <ListBoxItem>1</ListBoxItem> 
     <ListBoxItem>2</ListBoxItem> 
     <ListBoxItem>3</ListBoxItem> 
     <ListBoxItem>4</ListBoxItem> 
     <ListBoxItem>5</ListBoxItem> 
     <ListBoxItem>6</ListBoxItem> 
     <ListBoxItem>7</ListBoxItem> 
     <ListBoxItem>8</ListBoxItem> 
     <ListBoxItem>9</ListBoxItem> 
    </ListBox> 

</StackPanel> 

+1

Oder einfach 'Height =" Auto "' auf allen Zeilen ... – Clemens

+0

Ja, aber es braucht mehr Code enthält Einstellung der Zeilendefinition und etc ... –