2011-12-13 42 views
23

Tôi có một ứng dụng WPF sử dụng DataGrid để hiển thị một số dữ liệu. Khi tôi chạy chương trình có một cột bổ sung như ở đây: enter image description hereWPF DataGrid - Tại sao cột phụ

Đây là những gì nó trông giống như khi tôi thiết kế nó trong VS2010 enter image description here

Tôi đã tắt AutoGenerateColumns trên lưới dữ liệu và xác định các cột cá nhân như vậy (đây là một điều khiển người dùng):

<Grid Margin="10,10,10,10"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 


    <DataGrid x:Name="EmployeeHours" AutoGenerateColumns="False" ItemsSource="{Binding EmployeeHoursLastWeek}" Width="Auto"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="100" /> 
      <DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="75" /> 
      <DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="100" /> 
      <DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="100" /> 
      <DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="100" /> 
     </DataGrid.Columns> 
    </DataGrid> 

    <Button x:Name="ImportHoursButton" Content="Import Hours" 
      Command="{Binding ImportHoursCommand}" 
      Height="25" Width="100" Margin="10" 
      VerticalAlignment="Bottom" HorizontalAlignment="Right"     
      Grid.Row="1" /> 
</Grid> 

Tôi cũng có một MainWindowView có sử dụng tiêm để hiển thị các quan điểm như vậy (đây là một cửa sổ thông thường):

<Window x:Class="Sidekick.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:Sidekick.ViewModel" 
     xmlns:vw="clr-namespace:Sidekick.View" 
     Title="Sidekick"> 

    <!-- Typically done in a resources dictionary -->  
    <Window.Resources> 
     <DataTemplate DataType="{x:Type vm:EmployeeHoursViewModel}"> 
      <vw:EmployeeHoursView /> 
     </DataTemplate> 
    </Window.Resources> 

    <StackPanel> 
     <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" /> 
    </StackPanel> 

</Window> 

Trong thiết kế tôi đã xác định cả hai MainWindowView và EmployeeHoursView như Auto Kích gốc như tôi muốn cửa sổ đủ lớn để chứa lưới và nút. Tuy nhiên, khi tôi chạy chương trình, tôi nhận được một cột bổ sung trong lưới dữ liệu và nó làm cho cửa sổ chương trình lớn hơn gấp đôi (cả chiều rộng và chiều cao) khi EmployeeHoursView cần. Làm thế nào tôi có thể mã này như vậy mà cửa sổ ứng dụng của tôi là chỉ đủ lớn cho EmployeeHoursView mà không cung cấp các giá trị cụ thể? Điều gì khiến cột bổ sung này xuất hiện?

Trả lời

38

"Cột bổ sung" thực sự chỉ là không gian chưa sử dụng. Mỗi cột của bạn xác định một giá trị Độ rộng, vì vậy khi chúng được chỉ định, có không gian còn lại.

Nếu bạn muốn loại bỏ không gian đó, hãy tạo ít nhất một trong các cột của bạn thành một cột * để nó trải dài để lấp đầy không gian có sẵn.

Tôi đoán tốt nhất là tại sao nó trông bình thường trong Visual Studio có lẽ là vì bạn có chiều rộng thiết kế được đặt thành một cái gì đó nhỏ hơn chiều rộng thời gian chạy. Nếu nó lớn hơn, bạn sẽ thấy điều tương tự.

Nếu bạn không muốn kiểm soát để kéo, sau đó hãy chắc chắn để thiết lập nó (hoặc đó là cha mẹ của) ngang/dọc liên kết đến một cái gì đó khác hơn Stretch

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <ItemsControl ItemsSource="{Binding ViewModels}" Margin="3" /> 
</StackPanel> 
+0

Nhưng không phải là quan điểm Kích thước tự động, để kích thước các yếu tố (lưới dữ liệu trong trường hợp này và cửa sổ chính của proxy) chỉ là những gì là cần thiết? Một yếu tố kích thước nào khác sẽ được đưa vào chơi? Nếu tôi thay đổi chiều rộng của cột cuối thành "*" thì kích thước cửa sổ chung vẫn như cũ và bây giờ tôi có một cột siêu rộng. – BrianKE

+0

@BrianKE Từ trang MSDN của Microsoft: 'Hành vi định cỡ tự động ngụ ý rằng phần tử sẽ lấp đầy chiều rộng có sẵn cho nó. Tuy nhiên, lưu ý rằng các điều khiển cụ thể thường cung cấp các giá trị mặc định theo kiểu mặc định của chúng sẽ vô hiệu hóa hành vi định cỡ tự động trừ khi nó được bật lại cụ thể.' http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement .width.aspx – Rachel

+0

Cảm ơn, điều đó đã giúp tôi hướng theo SizeToContent trên MainWindow. Đặt giá trị này thành "WidthAndHeight" hiện đã kích thước chính xác kích thước của MainWindow dựa trên kích thước của DataGrid. – BrianKE

1

Cũng kể từ khi không gian không sử dụng nó, một cách khác xung quanh sẽ sử dụng chiều rộng có trọng số thay vì chiều rộng cố định. Bạn có thể sử dụng một cách tiếp cận lai cũng trong đó một số được cố định và một số được trọng, trong trường hợp đó chắc chắn là một trong những trọng (*) Vì vậy, trong mã của bạn nó sẽ là:

<DataGridTextColumn Header="PerceptionistID" Binding="{Binding PerceptionistID}" Width="4*" /> 
     <DataGridTextColumn Header="Week Of" Binding="{Binding WeekOf, StringFormat={}{0:MM/dd/yyyy}}" Width="3*" /> 
     <DataGridTextColumn Header="Regular Hours" Binding="{Binding WorkHours}" Width="4*" /> 
     <DataGridTextColumn Header="PTO Hours" Binding="{Binding PTOHours}" Width="4*" /> 
     <DataGridTextColumn Header="Holiday Hours" Binding="{Binding HolidayHours}" Width="4*" /> 
Các vấn đề liên quan