2013-07-26 3 views
10

У меня проблема с ScrollViewer, которую я использую для прокрутки пользовательского элемента управления, содержащего сетку данных. Без средства просмотра прокрутки столбцы заполняют сетку данных так, как я хочу, но при добавлении средства просмотра прокрутки столбцы сокращаются до ~ 15 пикселей. Я смог упростить свой макет и все еще способен воспроизвести это поведение.WPF ScrollViewer вокруг DataGrid влияет на ширину столбца

При привязке ширины datagrid к другому управлению столбцы имеют нормальное значение, но это имеет неожиданно тот же эффект, что и фиксированная ширина в datagrid. Я думаю, что я не первый, у кого есть эта проблема. Как я могу обойти это поведение, чтобы моя сетка регулировала свой размер до доступного пространства и придавала его колонкам пропозициональную ширину?

С ScrollViewer: enter image description here и без: 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

Вы пробовали это:

+0

Да, тот же результат, к сожалению. – Jay

+2

Удалить HorizontalScrollBarVisibility = «Авто» и попробовать. –

ответ

14

Да, у меня была эта проблема некоторое время назад, я прибег к обходного, я буду размещать здесь только упаковывают его полезного

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

Трюк должен был дать DataGrid ширина, в этом случае я обязан вернуться к охватывающему элементу

Или, если вы не используете HorizontalScrollBar вы можете отключить его, это позволит ScrollViewer рассчитать ширину, позволяющую DataGrid вычислить ширину.

+1

Сетка изменяется при изменении размера окна, но только при увеличении ширины. Любая идея, как изменить размер сетки при уменьшении ширины окна? – mardok

+0

Благодарим вас за этот прекрасный пример того, как исправить бит XAML с помощью XAML. ^^ – Hardryv

+0

Это предлагаемое решение вызывает ошибки VS2010 :-) Похож на ошибку – juFo

0

Я испытал то же самое на прошлой неделе.

Как правило, эта проблема возникает, когда следующие элементы:

  1. DataGrid без ширины помещается внутри ScrollViewer с HorizontalScrollBarVisibility свойства, установленного в Auto
  2. по меньшей мере один DataGridColumn имеет неограниченную/неопределенную ширину (например: Width="*")


На самом деле, решение зависит от ваших потребностей:

  • Либо вы хотите, чтобы ваши DataGridColumns принять все доступное пространство вашего DataGrid, когда окно не показывает (даже если там не будет отображаться данные): в этом случае sa_ddam213 «ю.ш. ответ может помочь вам справиться.
  • Или вы не против иметь пробелы между вашим последним столбцом и правую границу DataGrid на первом шоу Window.

Для последнего варианта, нужно просто установить фиксированную ширину для DataGridColumns (или просто не определить, если вы не хотите, это не очень важно, поскольку столбцы могут быть легко изменены с помощью пользователь через двойной щелчок). В этом контексте ваш DataGrid может быть определен без ширины.


Вот пример:

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


По этому пути, если содержание колонки работает над контейнером после колонки автоматического изменения размера, появится горизонтальная полоса прокрутки.

Смежные вопросы