2011-11-07 28 views
7

Tôi cần bảng có cả tiêu đề ngang và dọc (đơn giản PivotGrid). Tôi đã tìm thấy một số vấn đề tương tự (hoặc gần như giống nhau) ở đây, nhưng không ai đưa ra giải pháp. Trong XAML Tôi đã xác định cấu trúc này: (. Resp RowDefinitions)Lưới SharedSizeGroup - cột đang nảy, thay đổi kích thước trong vòng lặp vô hạn

<Grid x:Name="grdMain" Background="White" Grid.IsSharedSizeScope="True"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <Grid Grid.Row="0" Grid.Column="1" x:Name="grdHorizontalHeader"> 
     <!-- place for column definitions and header labels defined in code --> 
    </Grid> 
    <Grid Grid.Row="1" Grid.Column="0" x:Name="grdVerticalHeader"> 
     <!-- place for column definitions and header labels defined in code --> 
    </Grid> 
    <Grid Grid.Row="1" Grid.Column="1" x:Name="grdContent"> 
     <!-- place for column definitions and header labels defined in code --> 
    </Grid> 
</Grid> 

Vì vậy, cả hai tiêu đề bao gồm lưới với một số ColumnDefinitions và tôi cần phải kích thước header-ColumnDefinitions theo Content-ColumnDefinitions. Tôi làm điều đó trong mã:

foreach (var row in myColumnSource) 
{ 

    // Content columns definitions 

    var cD = new ColumnDefinition(); 
    cD.Width = GridLength.Auto; 
    cD.SharedSizeGroup = "ColumnSharedSizeGroup" + row.Value; 
    this.grdContent.ColumnDefinitions.Add(cD); 

    // Header columns definitions 

    var cD2 = new ColumnDefinition(); 
    cD2.Width = GridLength.Auto; 
    cD2.SharedSizeGroup = "ColumnSharedSizeGroup" + row.Value; 
    this.grdHorizontalHeader.ColumnDefinitions.Add(cD2); 
    ... 

Vì vậy, tiêu đề cột nên chia sẻ chiều rộng của nó với cột nội dung. Nhưng khi tôi chạy chương trình, các cột được bouncing và thay đổi kích thước trong vòng lặp vô hạn. Chia sẻ chiều cao của Row hoạt động tốt. Trường hợp có thể là vấn đề?

CHỈNH SỬA chỉ các cột trong tiêu đề (grdHorizontalHeader) mới thay đổi kích thước. Cột trong grdContent có chiều rộng chính xác và ổn định.

+0

Khi tôi xóa đoạn mã '+ row.Value', nó cũng hoạt động tốt. Nhưng tôi cần mỗi cột có kích thước cá nhân. – karel

+0

Khi tôi không sử dụng GridLength.Auto, sau đó nó hoạt động tốt. Nó xuất hiện, rằng autosize này là nguồn gốc của các vấn đề. – karel

Trả lời

1

Thuật toán điều khiển lưới để tự động định kích thước có thể đôi khi khó tính.

Bạn đã thử đặt MinWidth trên mỗi cột/hàng của mình chưa?

<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto" MinWidth="30" /> 
    <ColumnDefinition Width="Auto" MinWidth="30" /> 
    <ColumnDefinition Width="Auto" MinWidth="30" /> 
</Grid.ColumnDefinitions> 
<Grid.RowDefinitions> 
    <RowDefinition Height="Auto" MinHeight="15" /> 
    <RowDefinition Height="Auto" MinHeight="15" /> 
    <RowDefinition Height="Auto" MinHeight="15" /> 
</Grid.RowDefinitions> 

Không siêu thanh lịch, nhưng đã khắc phục vấn đề tương tự đối với chúng tôi.

1

Nếu một lưới có nhiều cột SharedSizeGroup, bố cục kết quả sẽ thực hiện số lượng vượt qua theo cấp số nhân để thử và sắp xếp chúng. Có người nào đó nói rằng Microsoft đã thừa nhận lỗi này, nhưng tôi không thể tìm thấy chi tiết về nó.

Để giải quyết vấn đề, tôi đã phá lưới của mình thành các lưới nhỏ hơn bên trong StackPanel. Điều này làm cho bố cục nhanh trở lại và giữ lại kích thước được chia sẻ.

Khi lưới của bạn là hai chiều, điều này sẽ khó hơn. Khi bạn đang thêm điều khiển động, có lẽ bạn có thể có một StackPanel dọc giữ StackPanels ngang giữ lưới nhỏ hơn?

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