Горизонтальная полоса прокрутки WPF DataGrid не отображается - PullRequest
17 голосов
/ 12 мая 2011

Я создал простой 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.Ничего такого.Как сделать так, чтобы полоса прокрутки появлялась?

Ответы [ 6 ]

19 голосов
/ 14 января 2012

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

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

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

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

4 голосов
/ 27 мая 2011

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

Когда пользователь прокручивает вправо и помещает фильтр в столбец, и по этим критериям не возвращается ни одна строка, тогда вся сетка переместится влево (все столбцы в левую позицию по умолчанию) и по горизонтали.полоса прокрутки исчезнет, ​​поэтому пользователь не сможет прокрутить столбец фильтра, чтобы отменить свое действие !!

Серьезная боль!

"Взлом", который я только что поместил в код, является обходным путем: (_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;
    }
}

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

3 голосов
/ 12 мая 2011

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

2 голосов
/ 12 мая 2011

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

Назовите вашу сетку "grid"

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

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

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

0 голосов
/ 09 мая 2019

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

Необходимо сделать две вещи:

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

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

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

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

    </DataGrid>
</ScrollViewer>
0 голосов
/ 13 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...