2010-09-15 27 views
10

Trong ví dụ này cột đầu tiên nhận được 100 và 2 cột tiếp theo nhận được 50 cột, đó là hành vi mong đợi.Tại sao WPF Grid không chia sẻ không gian bằng nhau khi cột giữa có MinWidth?

<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="100" /> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 

alt text

Nếu tôi di chuyển MinWidth tới cột giữa ...

<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition MinWidth="100" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 

... sau đó cột đầu tiên được 33,3 và cột cuối cùng 66,6 mà có vẻ kỳ lạ. Không chắc chắn lý do tại sao điều này sẽ thay đổi hành vi của lưới điện. Tôi hy vọng các cột 0 và 2 sẽ nhận được 50 cột.

alt text

Cập nhật: Tôi hiểu lý do tại sao điều này xảy ra, nhưng đã tự hỏi nếu có ai nghĩ nó là một lỗi (đặc biệt là kể từ khi hành vi trong Silverlight là khác nhau)

+0

Bóp cho câu trả lời trên twitter? Vâng, tôi đoán nó đã hoạt động. – Will

+0

Hmmm. Tôi đang sử dụng C# 3.5 và cột màu đỏ của tôi là kích thước của cột màu xanh dương của bạn và cột màu xanh dương của tôi là kích thước của cột màu đỏ của bạn cho ví dụ thứ hai. – Crispy

+0

@Chris yeah, nó đã thay đổi với 4.0. Tôi không thể tìm thấy bất cứ nơi nào các thay đổi đã được ghi nhận nên tôi đã mở một Connect. – Will

Trả lời

1

Chỉ cần một bản cập nhật .. Tôi đã thử các XAML đoạn mã với sự kết hợp của .NET 3.5/4.0 Silverlight 3/4 và vẫn không thể có được chiều rộng bình đẳng cho ví dụ thứ hai ...

XAML Đây là cách duy nhất xung quanh vấn đề rằng:

<Grid Width="200" Height="200"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width=".5*" /> 
      <ColumnDefinition MinWidth="100" /> 
      <ColumnDefinition Width=".5*" /> 
     </Grid.ColumnDefinitions> 
     <Border Background="Red" Grid.Column="0" /> 
     <Border Background="Yellow" Grid.Column="1" /> 
     <Border Background="Blue" Grid.Column="2" /> 
    </Grid> 

Mọi thông tin cập nhật về các nhân viên phụ của bạn?

0

không chắc chắn chính xác vấn đề là gì, nhưng hai lưới này hoạt động theo cách bạn muốn. Tôi thích thứ hai nhiều hơn lần đầu tiên kể từ khi nó xác định rõ ràng rằng cột đầu tiên và thứ ba nên chiếm không gian còn lại bằng nhau.

<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition MinWidth="100" Width="Auto" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 



<Grid Width="200" Height="200"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*" /> 
     <ColumnDefinition MinWidth="100" Width="Auto" /> 
     <ColumnDefinition Width="1*" /> 
    </Grid.ColumnDefinitions> 
    <Border Background="Red" Grid.Column="0" /> 
    <Border Background="Yellow" Grid.Column="1" /> 
    <Border Background="Blue" Grid.Column="2" /> 
</Grid> 
0

Nếu bạn muốn có chiều rộng bằng nhau, bạn không thể sử dụng Tự động. Bạn phải đặt chiều rộng của mỗi cột thành tỷ lệ mong muốn, cho 3 cột bạn muốn ".3 *" cho mỗi cột. MinWidth được ưu tiên nếu Chiều rộng được tính nhỏ hơn MinWidth.

3

Sự cố này chỉ phát sinh khi bạn có cột ở giữa, điều này ngụ ý bạn có một số cột lẻ được xác định cho lưới của mình. Tôi không chắc tại sao điều này xảy ra cũng như tôi nghĩ đó là hành vi có chủ ý. Tuy nhiên, một cách giải quyết khác là luôn đảm bảo rằng bạn có số cột được xác định ngay cả khi bạn chỉ sử dụng số lẻ của chúng (ẩn cột phụ bằng cách sử dụng MaxWidth = 0).

<Grid Width="200" Height="200"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" MinWidth="100"/> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" MaxWidth="0"/> <!--Workaround--> 
     </Grid.ColumnDefinitions> 

     <Border Grid.Column="0" Background="Red"/> 
     <Border Grid.Column="1" Background="Yellow"/> 
     <Border Grid.Column="2" Background="Blue"/> 
    </Grid> 

Bất lợi ở đây là bạn có cột trống trong lưới của mình. Lợi thế là bạn nhận được hành vi phân phối không gian mong đợi.

+0

Sự cố đã được giải quyết trong .NET 4.5 – TMSoftDev

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