Ответ 1
Я думаю, что когда Datagrid
пуст, ScrollViewer
ничего не обрабатывает. Попытайтесь заполнить столбцы, добавив ItemsSource
, поэтому должна появиться прокрутка:)
Я создал простой DataGrid с 4 столбцами, которые выходят за пределы DataGrid, а горизонтальная полоса прокрутки не отображается. Я попытался установить ширину для каждого столбца, но ничего не изменилось. Вот мой XAML:
<Window x:Class="WPFTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<DataGrid Height="200" Width="200" HorizontalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" />
<DataGridTextColumn Header="Column 2" />
<DataGridTextColumn Header="Column 3" />
<DataGridTextColumn Header="Column 4" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
И вот что я получаю:
Я также попытался обернуть DataGrid с помощью ScrollViewer. Ничего. Как я могу создать полосу прокрутки?
Я думаю, что когда Datagrid
пуст, ScrollViewer
ничего не обрабатывает. Попытайтесь заполнить столбцы, добавив ItemsSource
, поэтому должна появиться прокрутка:)
Мне также очень не нравится это поведение, так как я использую фильтры заголовков. Мой "взломать" намного проще, чем выше: просто поместите сетку данных в новый ScrollViewer
с помощью HorizontalScrollBarVisibility=Auto
и VerticalScrollBarVisibility=Disabled
(DataGrid уже обрабатывает этот тонкий). Например:
<ScrollViewer HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Disabled">
<DataGrid>
...
</DataGrid>
</ScrollViewer>
Конечно, это больше элементов управления на странице, но намного проще, чем взломанный код выше. До сих пор я не нашел способ сделать сетку данных делать это автоматически.
Побочным эффектом этого решения может быть скрытая вертикальная полоса прокрутки, пока вы не прокрутите ее вправо.
для меня это была основная проблема, так как я создаю много столбцов и позволяю пользователю фильтровать с помощью фильтров в заголовке.
Когда пользователь прокручивается вправо и помещает фильтр в столбец, и из-за этих критериев возвращается NO строк, тогда вся сетка будет перемещаться влево (все столбцы влево по умолчанию), а горизонтальная полоса прокрутки исчезнет поэтому пользователь не может прокрутить до столбца фильтра, чтобы отменить его действие!
Основная боль!
"hack", который я только что разместил в коде, - это способ его использования: (_dv указывает на DataView из DataTable)
// construct an overall sql filter statement
string sqlFilter = _setttings.SGColumns.GetFilterSQL();
BindingListCollectionView view = CollectionViewSource.GetDefaultView(gridMain.ItemsSource) as BindingListCollectionView;
if (view != null)
view.CustomFilter = sqlFilter; // "XGROUP = 'E' AND GEOG = 'U'";
if (view != null && _dv.Count == 0)
{
gridMain.ItemsSource = null;
gridMain.Items.Add("hello");
_RowHeightTemp = gridMain.RowHeight;
gridMain.RowHeight = 0;
}
else
{
if (gridMain.Items.Count == 1 && gridMain.Items[0].ToString() == "hello")
{
gridMain.Items.Clear();
gridMain.ItemsSource = _dv;
view = CollectionViewSource.GetDefaultView(gridMain.ItemsSource) as BindingListCollectionView;
view.CustomFilter = sqlFilter;
gridMain.RowHeight = _RowHeightTemp;
}
}
Теперь это гарантирует, что сетка остается в своем точном положении, когда строки не отображаются!
Прокрутка будет работать автоматически, как только вы добавите некоторые данные в сетку. Для тестирования вы можете применить этот код
Назовите свою сетку "сеткой"
Прикрепленное событие Window Loaded
private void Window_Loaded(object sender, RoutedEventArgs e)
{
grid.Items.Add(new object());
}
Появится прокрутка.
Установите Datagrid
свойства, как CanUserAddRows="True" IsReadOnly="True"
и оберните его с ScrollViewer. CanUserAddRows
дает вам пустую строку. Пустая строка сохраняет полосу прокрутки. IsReadOnly
скрывает пустую строку, так как она только для чтения.
Недостатком является то, что при вертикальной прокрутке заголовки сетки данных будут скрыты.
Очевидно, вам нужна горизонтальная полоса прокрутки.
Нужно сделать две вещи:
1. Добавьте свойство IsReadOnly="True"
в свой DataGrid
2. Добавьте MaxWidth="1200" VerticalScrollBarVisibility="Auto"
в ScrollViewer
MaxWidth необходимо установить, вы можете изменить 1200
на любое другое значение, как вам нужно.
<ScrollViewer MaxWidth="1200" VerticalScrollBarVisibility="Auto">
<DataGrid IsReadOnly="True">
</DataGrid>
</ScrollViewer>