2011-12-13 17 views
23

У меня есть приложение WPF, которое использует DataGrid для отображения некоторых данных. При запуске программы появляется дополнительный столбец, как показано здесь: enter image description hereWPF DataGrid - Почему дополнительный столбец

Вот как это выглядит, когда я его дизайн в VS2010 enter image description here

Я выключил AutoGenerateColumns на сетке данных и указаны столбцы индивидуально, как таковой (это пользовательский элемент управления):

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

У меня также есть MainWindowView, который использует инъекции для отображения мнения как таковые (это регулярное окно):

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

В конструкторе я заданный как MainWindowView и EmployeeHoursView, как Auto размера корень, как я хочу окно чтобы быть достаточно большим, чтобы разместить сетку и кнопку. Однако, когда я запускаю программу, я получаю дополнительный столбец в сетке данных, и это делает окно программы примерно вдвое большим (как шириной, так и высотой) в качестве EmployeeHoursView. Как я могу это кодировать так, чтобы окно моего приложения было достаточно большим для EmployeeHoursView без предоставления определенных значений? Что вызывает появление этого дополнительного столбца?

ответ

38

«Дополнительная колонка» на самом деле просто неиспользуемое пространство. Каждый из ваших столбцов определяет значение Width, поэтому после того, как они будут назначены, осталось пространство.

Если вы хотите избавиться от этого пространства, сделайте хотя бы один из столбцов столбец *, чтобы он заполнил свободное пространство.

Мое лучшее предположение о том, почему это выглядит нормально в Visual Studio, вероятно, связано с тем, что у вас ширина конструктора установлена ​​на меньшее, чем ширина времени выполнения. Если бы он был больше, вы бы увидели то же самое.

Если вы не хотите, чтобы ваш контроль, чтобы растянуть, то обязательно установите его (или его родителей) по горизонтали/вертикали выравнивание на что-то другое, чем Stretch

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

Но не то, что точки Auto Size, чтобы размер элементов (сетка данных в этом случае и главное окно по доверенности) только для того, что необходимо? Где еще будет действовать элемент калибровки? Если я изменил ширину последнего столбца на «*», тогда общий размер окна все тот же, и теперь у меня есть суперширокий столбец. – BrianKE

+0

@BrianKE С сайта MSDN от Microsoft: 'Автоматическое определение размера означает, что элемент заполнит доступную ему ширину. Обратите внимание, однако, что определенные элементы управления часто предоставляют значения по умолчанию в своих стилях по умолчанию, которые будут отключать поведение автоматического размера, если оно специально не включено. 'Http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement .width.aspx – Rachel

+0

Спасибо, что помогло мне указать в направлении SizeToContent на MainWindow. Установка этого параметра на «WidthAndHeight» теперь корректно определяет размер MainWindow на основе размера datagrid. – BrianKE

1

Ну так как его неиспользуемое пространство, еще один способ вокруг будет использоваться взвешенная ширина, а не фиксированная. Вы можете использовать гибридный подход, а некоторые, в котором фиксируются и некоторые взвешены, в этом случае обеспечить один взвешивается (*) Так что в вашем коде будет:

<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*" /> 
Смежные вопросы