2008-11-10 35 views
5

WPF GridSplitter làm cho lưới của tôi rộng hơn cửa sổ của tôi!Làm cách nào để giữ cho WPF GridSplitter thay đổi kích thước lưới của tôi?

Tôi có một Lưới WPF với một GridSplitter. Nếu tôi thay đổi kích thước các cột của mình, thì tôi có thể làm cho lưới của mình rộng hơn cửa sổ và không thể xem được.

Nó bắt đầu như thế này:

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

Nhưng sau khi mở rộng cột bên trái, tôi không còn có thể nhìn thấy cột bên phải (màu xanh):

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

Tôi đang làm gì sai rồi? Làm cách nào để giữ GridSplitter thay đổi kích thước của lưới của tôi?


Cập nhật:

Tôi vẫn đang phải vật lộn với điều này. Bây giờ tôi đã cố gắng làm tổ lưới trong lưới. Điều đó không giúp được gì. Dưới đây là ColumnDefinitions XAML, RowDefinitions của tôi, và 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> 

Cập nhật:

Tôi nghĩ rằng vấn đề là với sự kiểm soát WebBrowser. Xem câu hỏi mới:

WPF GridSplitter Doesn't Work With WebBrowser Control?

+0

Cửa sổ của bạn có tập hợp MaxWidth không? – BrainSlugs83

Trả lời

3

Nếu Window của bạn được thay đổi kích cỡ để Width của nó là ít hơn tổng các MinWidths cột của bạn, bạn sẽ thấy các cột cắt đứt, nhưng nếu không tôi không thể tái tạo vấn đề của bạn:

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

Mở rộng cột màu đỏ, cột này sẽ chỉ mở rộng cho đến khi cột bên phải đạt đến mức tối thiểu là 400, nó sẽ không khởi động nó khỏi trang.

Có thể bạn đang thiết lập các thuộc khác của Window hoặc lưới ngoài cùng có thể gây ra hành vi này ...

+0

Tôi đã làm việc này bằng cách đặt các giá trị MaxWidth tùy ý cao cho các cột trình duyệt không phải là web như bạn đã minh họa trong câu hỏi khác này: http://stackoverflow.com/questions/375841/wpf-gridsplitter-doesnt-work-with -webbrowser-control # 376480

6

Hãy thử thay đổi chiều rộng thành kích thước ngôi sao. Điều này sẽ làm cho bộ chia tách chỉ thay đổi kích thước các cột mà nó nằm, vì vậy không chắc chắn nếu đây là hành vi mong muốn của bạn. Tuy nhiên, với kích thước ngôi sao, nội dung sẽ không phát triển vượt ra ngoài giới hạn của cửa sổ.

<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

Điều này không hoạt động. –

+0

Điều này giải quyết được vấn đề cho tôi. Các cột ở hai bên của bộ tách phải có kích thước ngôi sao. –

2

Chụp sự kiện DragDelta là một cách khác để làm việc đó:

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); 
    } 
} 

Nhưng sử dụng MinWidth trên một * ColumnDefinition sẽ hoạt động tốt. Lưu ý rằng ColumnDefinition với MinWidth cần phải ở cấp cao nhất. Nó không hoạt động nếu nó được lồng trong một số lưới bên trong một cột.

3

Nó làm việc cho tôi mà không cần bất kỳ mã bổ sung khi không có cột với Auto Chiều rộng giữa các splitter, tức là .:

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

Nếu không, lưới sẽ được thay đổi kích thước.

Các vấn đề liên quan