2013-04-09 7 views
6

Ich habe eine ListBox, die Elemente enthält, die von UserControl abgeleitet werden. Das konkrete UserControl enthält (unter anderem) ein DataGrid. Grundsätzlich kann ich das konkrete UserControl nicht ändern (Änderungen nur zu Testzwecken; seine Art von Dritten). Die DataGrid-Spaltenbreite aller Spalten wird unterbrochen, sobald eine Spaltenbreite auf "*" gesetzt wird, was zum Füllen des gesamten Speicherplatzes erforderlich ist.wpf DataGrid-Spaltenbreite schlägt in ListBox fehl

Ich kann es mit einem vereinfachten Beispiel (ohne UserControl) reproduzieren. Wenn ich also ein DataGrid als ListBoxItem hinzufüge, bricht eine Spaltenbreite von "*" die Spaltenbreite ab. Übrigens, die Spalten können vom Benutzer nicht mehr geändert werden.

Einfaches Beispiel:

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

Wer weiß, wie dieses Problem beheben?

Grüße

Antwort

2

Basierend auf Anregung von sa_ddam213 fand ich eine Flickschusterei, die funktioniert. Ich habe bisher keine andere Idee.

Ich wickelte das DataGrid von einer ListView, löschte alle "Dekoration" aus der ListView und gebunden die Breite der GridViewColumn an die ActualWidth der ListView. Vielleicht funktioniert auch eine andere Steuerung als ListView. Ich habe gerade mit ListView gespielt. Ein einfacher Rahmen funktioniert nicht.

Die Ränder müssen irgendwie angepasst werden und es gibt eine Lücke auf der rechten Seite, die ich nicht los werde (aber ich kann damit leben). Wenn ich die HorizontalScrollBarVisibility des DataGrids nicht deaktiviere, bekomme ich seltsame blinkende geisterhafte horizontale Scrollbalken beim Ziehen der Widow-Breite mit der Maus.

Also hier ist der XAML scheint ausreichend zu sein. Beachten Sie, dass der eigentliche ListView-Kludon Teil des konkreten UserControls ist. jedoch die folgende (vereinfachte) Code zeigt, was ich tat:

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

Dennoch ist dies nur eine Abhilfe. Jede vernünftige "Lösung" ist immer noch willkommen.

0

Width = "Auto" wird das Problem lösen. Sie können 'MaxWidth' auch angeben, um die Spaltenbreitenerweiterung zu begrenzen.

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

hofft, dass dies helfen wird.

+0

Ich fürchte, es wird nicht. Width = "Auto" wird auf den Inhalt skaliert, während "*" auf den verfügbaren Platz _expand_ wird. Ich brauche Letzteres. BTW, Width = "Auto" ist der Standardwert, wenn Breite nicht angegeben ist - AFAIK. Also Width = "Auto" ist das selbe wie das 1. ListBoxItem in meinem Beispiel. – user2261015

1

Sie konnten die DataGrid Breite zurück zum ListBoxActualWidth binden, wird dies die DataGrid eine tatsächliche Größe anders als Auto geben und die * Schlichte funktionieren sollte.

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

jedoch aufgrund der Tatsache, die einige Abstand zwischen dem Inhalt und den Rändern der ListBox, können Sie zwicken haben die Margin (wie ich oben) ein kleines bisschen die DataGrid gehen über auf die vermeiden Recht.

Ergebnis:

enter image description here

+0

Dies ist eine vielversprechende Appraach. Leider funktioniert das nur mit meinem einfachen Beispiel. Wie ich bereits erwähnt habe, ist das eigentliche DataGrid "irgendwo" in einem UserControl. Tatsächlich ist es Teil eines Rasters, das Teil eines Expanders ist und eine gewisse Anzahl von Pixeln eingerückt hat. Daher ist die ActualWidth des ItemPresenter nicht die erforderliche Breite des DataGird und ich kann keine Annahmen über den Unterschied machen. Also habe ich versucht, das DataGrid in ein anderes Grid zu verschachteln und die Breite an die ActualWidth dieses Girds zu binden. Es funktioniert gut beim Vergrößern des Fensters, aber das DataGrid schrumpft nicht mehr, wenn das Fenster verkleinert wird. – user2261015