2013-04-09 19 views
6

Mam ListBox zawierający elementy pochodzące z UserControl. Konkretny UserControl zawiera (między innymi) DataGrid. Zasadniczo nie mogę zmienić konkretnego UserControl (zmiany tylko w celu testowania, jego rodzaju strony trzeciej). Szerokość kolumny DataGrid wszystkich kolumn zostanie zerwana, gdy tylko jedna szerokość kolumny zostanie ustawiona na "*", co jest wymagane do wypełnienia całego obszaru.wpf Niepoprawna szerokość kolumn danych w ListBox

Mogę odtworzyć go w uproszczonym przykładzie (bez UserControl). Więc jeśli dodaję DataGrid jako ListBoxItem, określenie szerokości kolumny "*" powoduje podział szerokości kolumny. BTW, kolumny nie mogą już być zmieniane przez użytkownika.

Prosty przykład:

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

Czy ktoś wie jak rozwiązać ten problem?

Pozdrowienia

Odpowiedz

2

Bazując na sugestię sa_ddam213 znalazłem kludge który działa. Nie mam innego pomysłu do tej pory.

Zawinąłem DataGrid przez ListView, usunąć wszystkie „kwiatowy” z ListView i związany szerokość GridViewColumn do ActualWidth ListView. Może działa też kontrola inna niż ListView. Po prostu bawiłem się z ListView. Prosta granica nie działa.

Marginesy muszą zostać zmienione w jakiś sposób, a po prawej stronie jest luka, której się nie pozbieram (ale mogę z tym żyć). O ile nie wyłączę HorizontalScrollBarVisibility z DataGrid, otrzymuję dziwne, migające poziome paski przewijania, podczas przeciągania szerokości wdów za pomocą myszy.

Oto XAML, który wydaje się wystarczający. Należy pamiętać, że rzeczywisty kij ListView będzie częścią konkretnego UserControl. Jednak następujące (uproszczony) kod pokazuje, co zrobiłem:

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

Mimo to, jest to tylko obejście. Wszelkie rozsądne "poprawki" nadal mile widziane.

0

width = "Auto" rozwiąże ten problem. Możesz także określić "MaxWidth", aby ograniczyć ekspansję szerokości kolumn.

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

Nadzieje to pomoże.

+0

Obawiam się, że tak nie będzie. Width = "Auto" zmieni rozmiar na zawartość, a "*" _expand_ na dostępne miejsce. Potrzebuję tego drugiego. BTW, Width = "Auto" jest ustawieniem domyślnym, jeśli szerokość nie jest określona - AFAIK. So Width = "Auto" będzie takie samo jak 1. ListBoxItem w moim przykładzie. – user2261015

1

Można powiązać szerokość DataGrid powrotem do ListBoxActualWidth, To daje DataGrid rozmiaru rzeczywistego innego niż Auto i zaklejania * powinno działać.

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

Jednak ze względu na to, iż jest jakiś odstęp między zawartością i krawędziach ListBox, być może trzeba będzie dostosować Margin (jak ja powyżej) odrobinę aby uniknąć DataGrid podchodząc do dobrze.

Wynik:

enter image description here

+0

To obiecująca aplikacja. Niestety działa to tylko na moim prostym przykładzie. Jak już wspomniałem, rzeczywista dataGrid jest "gdzieś" w UserControl. W rzeczywistości jest to część siatki, która jest częścią ekspandera i wcięła pewną ilość pikseli. Tak więc ActualWidth of ItemPresenter nie jest wymaganą szerokością DataGird i nie mogę przyjąć żadnych założeń dotyczących różnicy.So próbowałem zagnieździć DataGrid w innej Grid i związać szerokość do ActualWidth tego Gird. Działa dobrze podczas powiększania okna, ale DataGrid nie kurczy się już podczas zmniejszania okna. – user2261015

Powiązane problemy