2013-07-26 14 views
10

Mam problem z ScrollViewer, którego używam do przewijania formantu użytkownika, który zawiera siatkę danych. Bez przeglądarki przewijania kolumny wypełniają siatkę danych tak, jak chcę, ale podczas dodawania przeglądarki przewijania kolumny kurczą się do ~ 15 pikseli. Udało mi się uprościć mój układ i nadal mogę odtworzyć to zachowanie.Przeglądarka Scroll WPF wokół DataGrid wpływa na szerokość kolumny

Kiedy wiążące szerokość DataGrid inny kontrolować kolumny mają normalne z, ale że ma unsuprisingly ten sam efekt w postaci stałej szerokości na DataGrid. Chyba nie jestem pierwszym, który ma ten problem. Jak mogę obejść to zachowanie, aby moja siatka dostosowała swój rozmiar do dostępnej przestrzeni i nadała jej kolumnom szerokość proporcjonalną?

Z ScrollViewer: enter image description here i bez: enter image description here

<Window x:Class="GridTest.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"> 
<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
<Grid MinWidth="200"> 
    <DataGrid Margin="0" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Header="Column A" Width="*"/> 
      <DataGridCheckBoxColumn Header="Column B" Width="*"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</ScrollViewer> 

+0

Czy chciał w ten sposób:

+0

Tak, ten sam wynik niestety. – Jay

+2

Usuń HorizontalScrollBarVisibility = "Auto" i wypróbuj. –

Odpowiedz

14

Tak, miałem ten problem jakiś czas temu, że uciekają się do obejścia, będę post tutaj tylko okrywać jego użyteczne

<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
    <Grid x:Name="grid" MinWidth="200"> 
     <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}"> 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Header="Column A" Width="1*"/> 
       <DataGridCheckBoxColumn Header="Column B" Width="1*"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</ScrollViewer> 

Sztuką było dać DataGrid szerokości, w tym przypadku związany z powrotem do elementu zawierającego

Albo jeśli nie używać HorizontalScrollBar można go wyłączyć, Pozwoli to ScrollViewer obliczyć szerokość pozwalającą DataGrid obliczyć szerokość.

+1

Siatka jest zmieniana po zmianie wielkości okna, ale tylko przy zwiększeniu szerokości. Masz pomysł, jak zmienić rozmiar siatki, gdy szerokość okna również zostanie zmniejszona? – mardok

+0

Dziękuję za ten świetny przykład, jak naprawić trochę XAML za pomocą XAML. ^^ – Hardryv

+0

To proponowane rozwiązanie powoduje awarię VS2010 :-) Wygląda jak błąd – juFo

0

Doświadczyłem tego samego w zeszłym tygodniu.

Zazwyczaj ten problem występuje, gdy masz następujące elementy:

  1. DataGrid bez szerokości umieszczonej wewnątrz ScrollViewer z właściwością HorizontalScrollBarVisibility ustawiony Auto
  2. Co najmniej jeden DataGridColumn ma nieograniczoną/szerokość nieokreśloną (np: Width="*")


Faktycznie, Rozwiązanie zależy od Twoich potrzeb:

  • Albo chcesz swój DataGridColumns wziąć całą dostępną przestrzeń Twój DataGrid gdy okno jest wyświetlane (nawet jeśli nie będzie wyświetlane dane): w tym przypadku, sa_ddam213 „s odpowiedź może ci pomóc.
  • lub nie przeszkadza posiadające niektóre puste przestrzenie między ostatniej kolumnie i prawej krawędzi DataGrid na okno pierwszego pokazu.

Na ostatniej opcji, wystarczy ustawić stałe szerokości do DataGridColumns (lub po prostu nie definiują go, jeśli nie chcesz, to nie jest bardzo ważne, ponieważ kolumny mogą być łatwo zmieniany przez użytkownik poprzez podwójne kliknięcie). W tym kontekście można zdefiniować numer DataGrid bez szerokości.


Oto przykład:

<ScrollViewer HorizontalScrollBarVisibility="Auto"> 
    <Grid x:Name="grid" MinWidth="200"> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Header="Column A" Width="100"/> 
       <DataGridCheckBoxColumn Header="Column B" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</ScrollViewer> 


W ten sposób, jeśli zawartość kolumna pracuje nad pojemnikiem po automatycznej zmiany rozmiaru kolumny, pojawi się poziomy pasek przewijania.