2013-04-09 10 views
6

Ho un ListBox che contiene elementi derivati ​​da UserControl. Il concreto UserControl contiene (tra gli altri) un DataGrid. Fondamentalmente non posso cambiare il concreto UserControl (cambia solo a scopo di test, il suo tipo di terze parti). La larghezza della colonna DataGrid di tutte le colonne viene interrotta non appena una larghezza di colonna è impostata su "*", che è necessario per riempire lo spazio completo.wpf Larghezza colonne Datagrid non riuscite in ListBox

Posso riprodurlo con un esempio semplificato (senza UserControl). Quindi se aggiungo un DataGrid come ListBoxItem, specificando una larghezza di colonna di "*" si rompe la larghezza della colonna. A proposito, le colonne non possono più essere ridimensionate dall'utente.

semplice esempio:

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

Qualcuno sa come risolvere questo problema?

saluti

risposta

2

base nella suggestione di sa_ddam213 Ho trovato un kludge che funziona. Non ho altra idea fino ad ora.

ho avvolto il DataGrid un ListView, rimosso tutto "decorazione" dal ListView, e vincolata alla larghezza della GridViewColumn alla ActualWidth del ListView. Forse anche qualche controllo diverso da ListView. Stavo solo giocando con ListView. Un semplice bordo non funziona.

I margini devono essere modificati in qualche modo e c'è un buco sul lato destro di cui non mi sbarazzo (ma posso conviverci). A meno che non disabiliti HorizontalScrollBarVisibility del DataGrid ottengo strane barre di scorrimento orizzontali fantasma lampeggianti durante il trascinamento della larghezza della vedova dal mouse.

Quindi ecco XAML che sembra essere sufficiente. Si noti che il kludge ListView effettivo farà parte del concreto UserControl. Tuttavia, il seguente codice (semplificato) mostra quello che ho fatto:

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

Eppure, questa è solo una soluzione temporanea. Qualsiasi "correzione" ragionevole è ancora benvenuta.

0

width = "Auto" risolverà il problema. Inoltre, puoi specificare "MaxWidth" per limitare l'espansione della larghezza di colonna.

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

spera che questo aiuterà.

+0

Ho paura che non lo farà. Width = "Auto" ridimensionerà il contenuto, mentre "*" sarà _expand_ nello spazio disponibile. Ho bisogno di quest'ultimo. BTW, Larghezza = "Auto" è l'impostazione predefinita se Larghezza non è specificata - AFAIK. So Width = "Auto" sarà uguale al 1st ListBoxItem nel mio esempio. – user2261015

1

Si potrebbe legare la larghezza DataGrid indietro al ListBoxActualWidth, questo darà il DataGrid una dimensione effettiva diversa Auto e del suo dimensionamento * dovrebbe funzionare.

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

Tuttavia a causa del fatto la è una certa distanza tra il contenuto ei bordi della ListBox, potrebbe essere necessario modificare il Margin (come ho fatto sopra) un po 'piccolo per evitare il DataGrid andare oltre al destra.

Risultato:

enter image description here

+0

Questo è un apprauso promettente. Purtroppo questo funziona solo con il mio semplice esempio. Come ho già detto, il dataGrid attuale è "da qualche parte" in un UserControl. In effetti fa parte di una griglia che fa parte di un expander e rientra in una certa quantità di pixel. Quindi ActualWidth di ItemPresenter non è la larghezza richiesta di DataGird e non posso fare alcuna ipotesi sulla differenza. Così ho provato a nidificare il DataGrid in un'altra griglia e collegare la larghezza alla larghezza effettiva di quella Gird. Funziona bene quando si ingrandisce la finestra ma DataGrid non si riduce più quando si riduce la finestra. – user2261015