2015-06-01 11 views
5

Mam StackPanel, w którym owinąłem 7 prostokąta o różnych szerokościach.WPF XAML i MinWidth i MaxWidth

Mój pierwszy prostokąt w stosie, mam zdefiniowaną szerokość minimalną i maksymalną oraz jeden z pozostałych prostokątów (patrz poniżej x: Nazwa = "ToBeCollapsed"), który jest domyślnie zwinięty, ale BUT jest widoczny w pewnych warunkach w języku C#.
Mój problem polega na tym, że pierwszy prostokąt nie jest rozciągany do szerokości MAX, jeśli prostokąt "ToBeCollasped" jest zwinięty. Myślałem, że pierwszy prostokąt wypełni przestrzeń do MAX "755", jeśli zwinięty prostokąt zostanie zwinięty.

Czy mam rację w mojej logice?

Mój układ jest poniżej:

<StackPanel x:Name="RectangleColumns" Width="1840" Orientation="Horizontal"> 

    <Rectangle MinWidth="575" MaxWidth="755" /> 
    <Rectangle Width="315"/> 
    <Rectangle Width="180" /> 
    <Rectangle Width="180"/> 
    <!--If collapsed first rectangle should grow to 755. MinWidth + 180--> 
    <Rectangle x:Name="ToBeCollapsed" Width="180"/> 
    <Rectangle Width="220"/> 
    <Rectangle Width="190"/> 
</StackPanel> 
+0

StackPanel ma orientację poziomą? – Clemens

+6

Wydaje mi się, że lepiej będzie, jeśli użyjesz siatki. –

+0

@Clemens. Tak, StackPanel ma orientację poziomą. Zaktualizowano. – ClosDesign

Odpowiedz

3

Odpowiednia siatka z ustawionymi definicjami kolumn. Próbowałem to sobie za pomocą kilku kolorów wypełnienia i mniejszych szerokościach wykazać punkt, że pierwsza kolumna rośnie w przestrzeni, gdy piąta kolumna załamuje:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 

    <Grid Grid.Row="0" x:Name="RectangleColumns" HorizontalAlignment="Stretch "> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition MinWidth="200" MaxWidth="400"/> 
      <ColumnDefinition MaxWidth="50"/> 
      <ColumnDefinition MaxWidth="50"/> 
      <ColumnDefinition MaxWidth="50"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition MaxWidth="50"/> 
      <ColumnDefinition MaxWidth="50"/> 
     </Grid.ColumnDefinitions> 

     <Rectangle Grid.Column="0" Fill="Aqua" MinWidth="200" MaxWidth="400" /> 
     <Rectangle Grid.Column="1" Fill="Blue" Width="50"/> 
     <Rectangle Grid.Column="2" Fill="Aqua" Width="50" /> 
     <Rectangle Grid.Column="3" Fill="Blue" Width="50"/>    
     <Rectangle Grid.Column="4" Fill="Pink" Width="300" Name="toBeCollapsed"/> 
     <Rectangle Grid.Column="5" Fill="Aqua" Width="50"/> 
     <Rectangle Grid.Column="6" Fill="Blue" Width="50"/> 
    </Grid> 

    <Button Grid.Row="1" Content="Toggle Visibility" Name="ButtonToggle" /> 
</Grid> 

Code-tył, żeby wykazać, że:

public MainWindow() 
    { 
     InitializeComponent(); 
     ButtonToggle.Click += ButtonToggleOnClick; 
    } 

    private void ButtonToggleOnClick(object sender, RoutedEventArgs routedEventArgs) 
    { 
     toBeCollapsed.Visibility = toBeCollapsed.Visibility == Visibility.Collapsed 
      ? Visibility.Visible 
      : Visibility.Collapsed; 
    } 
+0

Właśnie to zobaczyłem, przetestuję to. Dzięki James. – ClosDesign

+0

Dokładnie to, czego potrzebowałem. Dziękuję bardzo za przykład. – ClosDesign

0

zawsze wyglądać za schene:

W WPF, każdy LayoutControl jest Grid - lub odtwarzalny z siatką - ale wykorzystuje różne kolumny lub wiersza definicji i Alignment.

Stackpanel jest siatka, która zawiera następujące ustawienia (poziomy):

  • Columndefinition za każde dodane kontroli z Auto wielkości
  • Wszystkie dodane Dziecko kontroluje HorizontalAligment jest Centrum
  • dodatkowe Columndefinition z * Szerokość

I tak właśnie kruszą się ciastka.

Automatyczne wymiarowanie rozkłada przestrzeń na podstawie rozmiaru zawartości w kolumnie lub wierszu.

który jest zwykle najmniejszy możliwy rozmiar:/

Więc +1 dla @Bradley Uffner

Użyj Grid gdzie Columndefinition z Min/Max Rectangle jest *.

+0

Ok. Zrobiłem to w siatce, ale ponieważ prostokąt zwinięty znajduje się w definicji kolumny, w mojej strukturze znajduje się teraz luka 180, w której znajduje się zwinięty prostokąt. Jakieś pomysły? Zrobiłem także pierwszą RowDefinition of Width = "*". Bez min. Lub maks.-EDIT: Tylko komentarz do Jamesa. Spróbuję tego. – ClosDesign