У меня есть DataGrid, который находится в одной из серии Expanders в изменяемом по размеру окне. Когда строки DataGrid загружаются, DataGrid распространяется в нижней части окна без каких-либо полос прокрутки.Как получить полосы прокрутки DataGrid для отображения, когда они находятся в расширителе?
Я уменьшил вопрос к простейшим элементам я мог бы ниже
Я пытался поставить DataGrid в отдельном ScrollViewer, но была такая же проблема.
Мне также нужны два других экспандера, чтобы они оставались видимыми в окне и не были сдвинуты с края. У меня был небольшой успех, поставив три Expanders в DockPanel, но DataGrid все еще расширился, чтобы заполнить все окно, нажав другие Expanders вне поля зрения.
XAML
<Window x:Class="WPFTestApp.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:WPFTestApp"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid Name="root">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Expander Grid.Row="0" Name="Expander1" Expanded="Expander_Expanded">
<Expander.Header>Expander</Expander.Header>
<Expander.Content>
<ScrollViewer>
<DataGrid Grid.Row="1" Name="dataGrid">
<DataGrid.Columns>
<DataGridTextColumn Header="A" Binding="{Binding A}" />
<DataGridTextColumn Header="B" Binding="{Binding B}" />
<DataGridTextColumn Header="C" Binding="{Binding C}" />
<DataGridTextColumn Header="D" Binding="{Binding D}" />
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
</Expander.Content>
</Expander>
<Expander Grid.Row="1" Name="Expander2" Expanded="Expander_Expanded">
<Expander.Content>
<TextBlock>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...</TextBlock>
</Expander.Content>
</Expander>
<Expander Grid.Row="2" Name="Expander3" Expanded="Expander_Expanded">
<Expander.Content>
<TextBlock>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...<LineBreak/>...</TextBlock>
</Expander.Content>
</Expander>
</Grid>
</Window>
CodeBehind
using System;
using System.Windows;
namespace WPFTestApp {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public class Data {
public Guid A { get; set; }
public Guid B { get; set; }
public Guid C { get; set; }
public Guid D { get; set; }
public Data() {
A = Guid.NewGuid();
B = Guid.NewGuid();
C = Guid.NewGuid();
D = Guid.NewGuid();
}
}
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
for (int x = 0; x < 20; x++) {
dataGrid.Items.Add(new Data());
}
}
private void Expander_Expanded(object sender, RoutedEventArgs e) {
if (Expander1 != sender)
Expander1.IsExpanded = false;
if (Expander2 != sender)
Expander2.IsExpanded = false;
if (Expander3 != sender)
Expander3.IsExpanded = false;
}
}
}
Это дает все три Расширители одинаковое количество вертикального пространства в сетка, независимо от того, расширены они или нет. Я играл с высотами RowDefinition и понял, что могу изменить высоту между авто и 1 * в функции Expander_Expanded, и он дал мне именно то, что я хотел. – Hypersapien
Вы можете установить высоту как угодно, но автоматически - либо в разметке XAML, либо программно. 1 * был всего лишь примером. – mm8
Я просто говорю, что высоты RowDefinitions нужно устанавливать по-разному в зависимости от расширения Expander или нет. Я разместил здесь свое решение. – Hypersapien