WPF Grid Горизонтальная полоса прокрутки вместо изменения размера столбца - PullRequest
0 голосов
/ 15 мая 2018

У меня есть Сетка со многими столбцами.

На экранах небольших ПК размер столбцов автоматически изменяется. Вместо этого поведения по умолчанию я хочу горизонтальную полосу прокрутки (и размер столбцов не должен изменяться).

Если я установлю свойство MinWidth для каждого столбца, у меня будет полоса прокрутки, но я больше не могу изменять размер столбцов (недостаточно места). Я также не смог добиться успеха с ScrollViewer (и это повредило выступлениям).

Как я могу получить полосу прокрутки и иметь возможность изменить размер столбцов?

<Grid>
    <DataGrid Height="200" Width="200" HorizontalScrollBarVisibility="Visible">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column 1" Binding=.../>
            <DataGridTextColumn Header="Column 2" Binding=.../>
            <DataGridTextColumn Header="Column 3" Binding=.../>
            <DataGridTextColumn Header="Column 4" Binding=.../>
           [...]
        </DataGrid.Columns>
    </DataGrid>
</Grid>

1 Ответ

0 голосов
/ 15 мая 2018

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

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            LoadData();
        }
       private void LoadData()
        {
            DataTable foo = new DataTable();
            for (int i = 0; i < 20; i++)
            {
                foo.Columns.Add(new DataColumn("column" + i, typeof(String)));
            }
            for (int i = 0; i < 20; i++)
            {
                DataRow dr = foo.NewRow();
                foreach (DataColumn dc in foo.Columns)
                {
                    if(i%5 ==0)
                    {
                        dr[dc] = string.Format("Looong and wide Data value {0} for cell.", i);
                    }
                    else
                    {
                        dr[dc] = string.Format("Data value {0} for cell.", i);
                    }
                }
                foo.Rows.Add(dr);
            }
            dataGrid.ItemsSource = foo.DefaultView;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //cts.Cancel();
            dataGrid.EnableRowVirtualization = !dataGrid.EnableRowVirtualization;
            LoadData();
        }

    }
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Click="Button_Click" Content="Toggle Virtualization" HorizontalAlignment="Left" Margin="59,47,0,0" VerticalAlignment="Top" Width="75"/>
        <DataGrid HorizontalAlignment="Left" x:Name="dataGrid" AutoGenerateColumns="True"
             Width="695"     Height="257" Margin="59,93,0,0" 
                  VerticalAlignment="Top" > 
        </DataGrid> 
    </Grid>
</Window>
...