2011-12-13 14 views
23

Mam aplikację WPF, która używa DataGrid do wyświetlania niektórych danych. Kiedy uruchamiam program jest dodatkowa kolumna, jak pokazano tutaj: enter image description hereWPF DataGrid - Dlaczego dodatkowa kolumna

Oto jak to wygląda, kiedy zaprojektować go w VS2010 enter image description here

mam wyłączony AutoGenerateColumns na siatce danych i określone kolumny indywidualnie jako takie (to jest sterowanie przez użytkownika):

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

Mam też MainWindowView który używa zastrzyk, aby wyświetlić widoki jako takich (jest to regularne okno):

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

w projektancie mam podane zarówno MainWindowView i EmployeeHoursView jak Auto korzenia rozmiar jak chcę okno być wystarczająco dużym, aby pomieścić siatkę i przycisk. Jednak po uruchomieniu programu otrzymuję dodatkową kolumnę w siatce danych i sprawia ona, że ​​okno programu jest około dwa razy większe (zarówno szerokość, jak i wysokość), jak potrzebuje EmployeeHoursView. Jak mogę zakodować to tak, że moje okno aplikacji jest wystarczająco duże dla EmployeeHoursView bez podania konkretnych wartości? Co powoduje pojawienie się tej dodatkowej kolumny?

Odpowiedz

38

"Dodatkowa kolumna" to tak naprawdę nieużywane miejsce. Każda z twoich kolumn definiuje wartość Szerokość, więc po ich przypisaniu pozostało wolne miejsce.

Jeśli chcesz pozbyć się tego miejsca, ustaw co najmniej jedną z kolumn kolumnę *, aby rozciągała się w celu wypełnienia dostępnej przestrzeni.

Moje najlepsze przypuszczenie, dlaczego w Visual Studio wygląda normalnie, prawdopodobnie wynika z tego, że szerokość projektanta ustawiona jest na mniejszą niż szerokość runtime. Gdyby był większy, zobaczyłbyś to samo.

Jeśli nie chcesz, aby kontrolę do rozciągania, następnie należy ustawić to (lub jego rodzica) dostosowywanie poziomy/pionowy do czegoś innego niż Stretch

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

Ale nie jest to, że w punkcie Auto Size, aby dopasować elementy (siatkę danych w tym przypadku i główne okno proxy) do tego, co jest potrzebne? Gdzie indziej miałby wejść element zaklejający? Jeśli zmienię szerokość ostatniej kolumny na "*", cały rozmiar okna pozostanie taki sam, a teraz mam super szeroką kolumnę. – BrianKE

+0

@BrianKE Ze strony MSDN firmy Microsoft: "Automatyczne określanie rozmiarów oznacza, że ​​element wypełni dostępną dla niego szerokość. Zauważ jednak, że określone kontrolki często dostarczają domyślne wartości w domyślnych stylach, które wyłączą automatyczne rozmiary, chyba że zostaną specjalnie ponownie włączone. "Http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement .width.aspx – Rachel

+0

Dzięki, pomógł mi wskazać w kierunku SizeToContent na MainWindow. Ustawienie tego na "WidthAndHeight" teraz poprawnie dopasowuje MainWindow w oparciu o rozmiar datagrid. – BrianKE

1

Dobrze, ponieważ jego niewykorzystanej przestrzeni, innym sposobem dookoła będzie używana ważona szerokość, a nie stała. Można użyć podejście hybrydowe, a także w którym niektóre są stałe, a niektóre są ważone w tym przypadku zapewnić jeden jest ważony (*) Więc w kodzie będzie:

<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*" />