Горизонтальная полоса прокрутки WPF DataGrid не отображается

Я создал простой 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>

И вот что я получаю:

enter image description here

Я также попытался обернуть DataGrid с помощью ScrollViewer. Ничего. Как я могу создать полосу прокрутки?

Ответы

Ответ 1

Я думаю, что когда Datagrid пуст, ScrollViewer ничего не обрабатывает. Попытайтесь заполнить столбцы, добавив ItemsSource, поэтому должна появиться прокрутка:)

Ответ 2

Мне также очень не нравится это поведение, так как я использую фильтры заголовков. Мой "взломать" намного проще, чем выше: просто поместите сетку данных в новый ScrollViewer с помощью HorizontalScrollBarVisibility=Auto и VerticalScrollBarVisibility=Disabled (DataGrid уже обрабатывает этот тонкий). Например:

<ScrollViewer HorizontalScrollBarVisibility="Auto"
              VerticalScrollBarVisibility="Disabled">
    <DataGrid>
        ...
    </DataGrid>
</ScrollViewer>

Конечно, это больше элементов управления на странице, но намного проще, чем взломанный код выше. До сих пор я не нашел способ сделать сетку данных делать это автоматически.

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

Ответ 3

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

Когда пользователь прокручивается вправо и помещает фильтр в столбец, и из-за этих критериев возвращается 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;
    }
}

Теперь это гарантирует, что сетка остается в своем точном положении, когда строки не отображаются!

Ответ 4

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

Назовите свою сетку "сеткой"

Прикрепленное событие Window Loaded

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        grid.Items.Add(new object());
    }

Появится прокрутка.

Ответ 5

Установите Datagrid свойства, как CanUserAddRows="True" IsReadOnly="True" и оберните его с ScrollViewer. CanUserAddRows дает вам пустую строку. Пустая строка сохраняет полосу прокрутки. IsReadOnly скрывает пустую строку, так как она только для чтения.

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

Ответ 6

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

Нужно сделать две вещи:

1. Добавьте свойство IsReadOnly="True" в свой DataGrid

2. Добавьте MaxWidth="1200" VerticalScrollBarVisibility="Auto" в ScrollViewer

MaxWidth необходимо установить, вы можете изменить 1200 на любое другое значение, как вам нужно.

<ScrollViewer MaxWidth="1200" VerticalScrollBarVisibility="Auto">
    <DataGrid IsReadOnly="True">

    </DataGrid>
</ScrollViewer>