2008-11-10 16 views
5

WPF GridSplitter sprawia, że ​​moja siatka jest szersza niż moje okno!Co zrobić, aby program GridSplitter WPF nie zmienił rozmiaru siatki?

Mam siatki WPF z GridSplitter. Jeśli zmieniam rozmiar kolumn, mogę uczynić moją siatkę szerszą niż moje okno i niewidoczną.

Zaczyna się tak:

WPF Grid http://img201.imageshack.us/img201/9505/onehg6.jpg

Ale po poszerzenie lewej kolumnie nie mogę już zobaczyć w prawej kolumnie (zielona):

WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6.jpg

Co robię źle? Jak utrzymać GridSplitter przed zmianą rozmiaru mojej siatki?


Aktualizacja:

ja wciąż zmaga się z tym. Próbowałem teraz sieci gniazdowania w sieciach. To nie pomogło. Oto moje ColumnDefinitions XAML RowDefinitions i GridSplitters ...

<Window ... > 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" MinWidth="150" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" MinWidth="400" /> 
     </Grid.ColumnDefinitions> 
     <GridSplitter 
      ResizeDirection="Columns" 
      ResizeBehavior="BasedOnAlignment" 
      Grid.Column="1" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Stretch" 
      Width="2" 
      Margin="0,5,0,5" 
      Panel.ZIndex="1"/> 
     <Grid Grid.Column="0"> 
      ... 
     </Grid> 
     <Grid Grid.Column="2"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" MinWidth="150" /> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition Width="*" MinWidth="200" /> 
      </Grid.ColumnDefinitions> 
      <GridSplitter 
       ResizeDirection="Columns" 
       ResizeBehavior="PreviousAndNext" 
       Grid.Column="1" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Stretch" 
       Width="2" 
       Margin="0,5,0,5" 
       Panel.ZIndex="1"/> 
      <Grid Grid.Column="0"> 
       ... 
      </Grid> 
      <Grid Grid.Column="2"> 
       ... 
      </Grid> 
     </Grid> 
    </Grid> 
</Window> 

Aktualizacja:

Myślę, że problem jest z formantu WebBrowser. Zobacz nowe pytanie:

WPF GridSplitter Doesn't Work With WebBrowser Control?

+0

Czy Twoje okno ma zestaw MaxWidth? – BrainSlugs83

Odpowiedz

3

Jeśli okno jest zmieniany więc jego szerokość jest mniejsza niż suma MinWidths kolumn, zobaczysz kolumny odcięte, ale inaczej nie można odtworzyć problemu:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition MinWidth="150" Width="*"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition MinWidth="400" Width="*"/> 
     </Grid.ColumnDefinitions> 
     <GridSplitter 
      Width="2" 
      Grid.Column="1" 
      HorizontalAlignment="Center" 
      Margin="0,5,0,5" 
      Panel.ZIndex="1" 
      VerticalAlignment="Stretch" 
      ResizeBehavior="BasedOnAlignment" 
      ResizeDirection="Columns"/> 
     <Grid Grid.Column="0"> 
      <Border Background="Red" Margin="5"/> 
     </Grid> 
     <Grid Grid.Column="2"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition MinWidth="150" Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition MinWidth="200" Width="*"/> 
      </Grid.ColumnDefinitions> 
      <GridSplitter 
       Width="2" 
       Grid.Column="1" 
       HorizontalAlignment="Center" 
       Margin="0,5,0,5" 
       Panel.ZIndex="1" 
       VerticalAlignment="Stretch" 
       ResizeBehavior="PreviousAndNext" 
       ResizeDirection="Columns"/> 
      <Grid Grid.Column="0"> 
       <Border Background="Green" Margin="5"/> 
      </Grid> 
      <Grid Grid.Column="2"> 
       <Border Background="Blue" Margin="5"/> 
      </Grid> 
     </Grid> 
    </Grid> 
</Window> 

Rozszerzając czerwoną kolumnę, rozwinie się ona tylko do momentu, w którym prawidłowa kolumna osiągnie Min. Szerokość 400, nie uruchomi jej poza stroną.

Jest możliwe, że masz ustawione inne właściwości okna lub zewnętrznej sieci, które spowodowałoby to zachowanie ...

+0

Mam to do pracy, ustawiając dowolnie wysokie wartości MaxWidth dla kolumn innych niż przeglądarki internetowe, jak zademonstrowałeś w tym drugim pytaniu: http://stackoverflow.com/questions/375841/wpf-gridsplitter-doesnt-work-with -webbrowser-control # 376480

6

Spróbuj zmienić szerokość do gwiazdy rozmiary. Spowoduje to, że rozdzielacz zmieni tylko rozmiar kolumn, pomiędzy którymi siedzi, więc nie jesteś pewien, czy jest to pożądane zachowanie. Jednak w przypadku rozmiarów gwiazd zawartość nie wzrośnie poza granice okna.

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="2*" MinWidth="100" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" MinWidth="50" /> 
     <ColumnDefinition Width="2*" MinWidth="100" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="3*" MinWidth="150" /> 
    </Grid.ColumnDefinitions> 
    <GridSplitter 
     ResizeDirection="Columns" 
     Grid.Column="1" 
     Grid.RowSpan="8" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Stretch" 
     Width="2" 
     Margin="0,5,0,5" 
     Panel.ZIndex="1"/> 
    ... 
</Grid> 
+0

To nie działa. –

+0

To rozwiązało problem dla mnie. Kolumny po obu stronach rozdzielacza muszą mieć rozmiary gwiazd. –

2

Przechwytywanie zdarzenie DragDelta jest inny sposób to zrobić:

private void VerticalGridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
{ 
    if (GridName.ColumnDefinitions[2].Width.Value < 400) 
    { 
     GridName.ColumnDefinitions[2].Width = new GridLength(400); 
    } 
} 

Ale używanie MinWidth na * ColumnDefinition powinno działać dobrze. Zauważ, że ColumnDefinition z MinWidth musi znajdować się na najwyższym poziomie. Nie działa, jeśli jest zagnieżdżony w jakiejś siatce wewnątrz kolumny.

3

To działa na mnie bez żadnego dodatkowego kodu, gdy nie ma Kolumny z Auto Szerokość między rozgałęźniki, tj .:

<Grid > 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="20*" MinWidth="50" MaxWidth="500" /> 
    <ColumnDefinition Width="Auto"/> <!-- Remove such columns /--> 
    <ColumnDefinition Width="100*" MinWidth="850"/> 
    <ColumnDefinition Width="30*" MinWidth="50" MaxWidth="800" /> 
</Grid.ColumnDefinitions> 
... 
<GridSplitter HorizontalAlignment="Right" Width="3"/> 
... 
<GridSplitter Grid.Column="3" HorizontalAlignment="Left" Width="3" /> 
<!-- Assign Grid.Column to 2 if you remove the auto width column /--> 
... 
</Grid> 

Inaczej siatka będzie skalowalny.

Powiązane problemy