2013-04-09 38 views
6

Tôi có một ListBox chứa các mục bắt nguồn từ UserControl. UserControl cụ thể chứa (trong số những người khác) một DataGrid. Về cơ bản tôi không thể thay đổi UserControl cụ thể (chỉ thay đổi cho mục đích thử nghiệm; loại bên thứ ba của nó). Chiều rộng cột DataGrid của tất cả các cột bị hỏng ngay sau khi một chiều rộng cột được đặt thành "*", được yêu cầu để lấp đầy không gian đầy đủ.wpf Chiều rộng cột Datagrid không thành công trong ListBox

Tôi có thể tạo lại bằng một ví dụ đơn giản (w/o UserControl). Vì vậy, nếu tôi thêm một DataGrid như ListBoxItem, chỉ định một chiều rộng cột của "*" phá vỡ chiều rộng cột. BTW, các cột cũng không thể được thay đổi kích thước bởi người dùng nữa.

ví dụ đơn giản:

<Window x:Class="DataGridSpike.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ListBox HorizontalContentAlignment="Stretch" > 
     <!-- Column width is basically ok but only since not "*" --> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Column1"/> 
       <DataGridTextColumn Header="Column2"/> 
       <DataGridTextColumn Header="Column3"/> 
      </DataGrid.Columns> 
     </DataGrid> 

     <!-- Broken column width: --> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Column1"/> 
       <DataGridTextColumn Header="Column2" Width="*"/> 
       <DataGridTextColumn Header="Column3"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </ListBox> 
</Grid> 

Có ai biết làm thế nào để sửa lỗi này?

Kính trọng

Trả lời

2

Có trụ sở tại đề nghị của sa_ddam213 Tôi tìm thấy một kludge mà làm việc. Tôi không có ý tưởng nào khác cho đến nay.

Tôi đã bọc DataGrid theo ListView, xóa tất cả "trang trí" khỏi ListView và giới hạn chiều rộng của GridViewColumn thành ActualWidth của ListView. Có lẽ một số điều khiển khác hơn là ListView hoạt động, quá. Tôi chỉ chơi đùa với ListView. Một đường viền đơn giản không hoạt động.

Lợi nhuận phải được điều chỉnh theo một cách nào đó và có một khoảng trống ở bên phải tôi không loại bỏ (nhưng tôi có thể sống với nó). Trừ khi tôi vô hiệu hóa HorizontalScrollBarVisibility của DataGrid tôi nhận được các thanh cuộn ngang ma kỳ lạ nhấp nháy trong khi kéo chiều rộng góa phụ bằng chuột.

Vì vậy, đây là XAML dường như là đủ. Lưu ý rằng thực tế ListView kludge sẽ là một phần của UserControl cụ thể. Tuy nhiên, mã sau (đơn giản) này cho thấy những gì tôi đã làm:

<Window x:Class="DataGridSpike.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ListBox HorizontalContentAlignment="Stretch"> 
      <!-- ListView is just a kludge --> 
      <ListView HorizontalContentAlignment="Stretch" Padding="-4,2,-10,0" BorderThickness="0"> 
       <ListView.View> 
        <GridView> 
         <GridView.ColumnHeaderContainerStyle> 
          <Style> 
           <Setter Property="FrameworkElement.Visibility" Value="Collapsed"/> 
          </Style> 
         </GridView.ColumnHeaderContainerStyle> 
         <GridViewColumn Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" /> 
        </GridView> 
       </ListView.View> 
       <DataGrid HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" 
        Padding="-2,0" HorizontalScrollBarVisibility="Disabled"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Column1"/> 
         <DataGridTextColumn Header="Column2" Width="1*" /> 
         <DataGridTextColumn Header="Column3" /> 
        </DataGrid.Columns> 
       </DataGrid> 
      </ListView> 
     </ListBox> 
    </Grid> 
</Window> 

Tuy nhiên, đây chỉ là giải pháp thay thế. Bất kỳ "sửa chữa" hợp lý vẫn được chào đón.

0

Chiều rộng = "Tự động" sẽ giải quyết được sự cố. Ngoài ra, bạn có thể chỉ định 'MaxWidth' để giới hạn độ rộng mở rộng của cột.

 <DataGrid.Columns> 
       <DataGridTextColumn Header="Column1"/> 
       <DataGridTextColumn Header="Column2" Width="Auto" MaxWidth="200" /> 
       <DataGridTextColumn Header="Column3"/> 
     </DataGrid.Columns> 

Hy vọng điều này sẽ hữu ích.

+0

Tôi sợ điều đó sẽ không xảy ra. Chiều rộng = "Tự động" sẽ kích thước nội dung, trong khi "*" sẽ _expand_ đến không gian có sẵn. Tôi cần cái sau. BTW, Chiều rộng = "Tự động" là mặc định nếu Chiều rộng không được chỉ định - AFAIK. Vì vậy, Width = "Auto" sẽ giống như ListBoxItem 1 trong ví dụ của tôi. – user2261015

1

Bạn có thể ràng buộc chiều rộng DataGrid trở lại ListBoxActualWidth, điều này sẽ cung cấp cho các DataGrid một kích thước thực tế khác hơn Auto* cỡ nên làm việc.

<!-- Broken column width: --> 
<DataGrid Width="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsPresenter}}}" Margin="-2,0,0,0"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column1"/> 
     <DataGridTextColumn Header="Column2" Width="*"/> 
     <DataGridTextColumn Header="Column3"/> 
    </DataGrid.Columns> 
</DataGrid> 

Tuy nhiên do thực tế là một số khoảng cách giữa nội dung và các cạnh của ListBox, bạn có thể phải chỉnh Margin (giống như tôi đã làm ở trên) một chút để tránh DataGrid sẽ giao cho đúng.

Kết quả:

enter image description here

+0

Đây là một đánh giá đầy hứa hẹn. Thật không may điều này làm việc với ví dụ đơn giản của tôi, chỉ. Như tôi đã đề cập, dataGrid thực tế là "một nơi nào đó" trong UserControl. Trong thực tế, nó là một phần của một Grid là một phần của Expander và thụt vào một số lượng pixel. Vì vậy, ActualWidth của ItemPresenter không phải là chiều rộng yêu cầu của DataGird và tôi không thể đưa ra bất kỳ giả định nào về sự khác biệt. Tôi đã cố gắng lồng DataGrid vào một Grid khác và liên kết chiều rộng với ActualWidth của Gird đó. Nó hoạt động tốt khi mở rộng cửa sổ nhưng DataGrid không co lại nữa khi giảm cửa sổ. – user2261015

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