2011-12-13 9 views
23

Ho un'app WPF che utilizza DataGrid per visualizzare alcuni dati. Quando eseguo il programma v'è una colonna aggiuntiva, come mostrato qui: enter image description hereWPF DataGrid - Perché la colonna in più

Ecco quello che sembra quando progetto in VS2010 enter image description here

Ho spento AutoGenerateColumns sulla griglia di dati e specificate le colonne singolarmente come tale (questo è un controllo utente):

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

Ho anche un MainWindowView che utilizza l'iniezione per visualizzare i punti di vista in quanto tali (questa è una finestra normale):

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

nella finestra di progettazione Ho specificato sia MainWindowView e EmployeeHoursView come Auto Root Formato come voglio la finestra per essere abbastanza grande da ospitare la griglia e il pulsante. Tuttavia, quando eseguo il programma ottengo una colonna aggiuntiva nella griglia di dati e rende la finestra del programma circa due volte più grande (sia la larghezza che l'altezza) come deve essere EmployeeHoursView. Come posso codificare questo in modo tale che la finestra dell'applicazione sia sufficientemente grande per EmployeeHoursView senza fornire valori specifici? Che cosa sta causando l'apparizione di questa colonna aggiuntiva?

risposta

38

La "colonna in più" è in realtà solo spazio inutilizzato. Ciascuna delle tue colonne definisce un valore di Larghezza, quindi una volta assegnati vengono lasciati spazi.

Se si desidera eliminare tale spazio, creare almeno una delle colonne una colonna * in modo che si estenda per riempire lo spazio disponibile.

La mia ipotesi migliore sul perché sembra normale in Visual Studio è probabilmente perché la larghezza del progettista è impostata su qualcosa di più piccolo della larghezza di runtime. Se fosse più grande, vedresti la stessa cosa.

Se non si desidera che il controllo di allungare, quindi assicuratevi di impostare è (o è del genitore) allineamento orizzontale/verticale a qualcosa di diverso Stretch

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

Ma non è che il punto di Dimensione automatica, per dimensionare gli elementi (la griglia di dati in questo caso e la finestra principale per proxy) solo per ciò che è necessario? In quale altro posto entrerebbe in gioco un elemento di dimensionamento? Se cambio la larghezza dell'ultima colonna in "*", la dimensione generale della finestra è sempre la stessa e ora ho una colonna super ampia. – BrianKE

+0

@BrianKE Dal sito MSDN di Microsoft: 'Il comportamento di dimensionamento automatico implica che l'elemento riempirà la larghezza disponibile. Si noti tuttavia che controlli specifici forniscono frequentemente valori predefiniti nei loro stili predefiniti che disabiliteranno il comportamento del dimensionamento automatico a meno che non venga riattivato specificamente. Http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement .width.aspx – Rachel

+0

Grazie, questo mi ha aiutato a indirizzarmi verso SizeToContent sulla Finestra Principale. Impostando questo su "WidthAndHeight" ora dimensiona correttamente la finestra principale in base alla dimensione del datagrid. – BrianKE

1

Bene fin dal suo spazio inutilizzato, un altro modo intorno sarà usata una larghezza pesata piuttosto che una fissa. È possibile utilizzare un approccio ibrido e in cui alcuni sono fissi e alcuni sono ponderati, in questo caso garantire uno è ponderato (*) Così nel codice sarà:

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