Мне нужно реализовать окно, содержащее несколько таблиц, в один просмотр прокрутки. Это означает, что эти таблицы должны быть растянуты по содержимому. Пользователь может добавлять/удалять элементы (строки) в эти таблицы.WPF: Быстрая автоматическая калибровка по высоте сетки
Концепция была показана на следующем макете. Основная проблема заключается в том, что сетка не должна иметь полосу прокрутки, она должна иметь динамическую высоту.
На данный момент этот интерфейс реализуется как ItemsControl внутри ScrollViewer. В ItemTemplate элемента ItemsControl добавлен DataGrid для представления табличных данных.
<ScrollViewer CanContentScroll="True"
HorizontalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Path=Groups}"
VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="125" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Grid.Row="0"
Style="{StaticResource ResourceKey=LabelBaseStyle}"
Content="{Binding Path=GroupLabel}"
HorizontalAlignment="Right"/>
<Button Content="{x:Static Member=Resources:CommonStrings.Delete}"
Style="{StaticResource ResourceKey=ButtonBaseStyle}"
VerticalAlignment="Center" />
<DataGrid Grid.Row="0" Grid.Column="1"
AutoGenerateColumns="False"
ItemsSource="{Binding Path=Items}">
<DataGrid.Columns>
<!-- 21 text columns here -->
</DataGrid.Columns>
</DataGrid>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
Это решение работает нормально, пока не будет добавлен некоторый объем данных. Теперь на 7 таблицах (сетках) с примерно 50 элементами в каждом приложении невозможно медленное: для его рендеринга требуется несколько минут. После профилирования я обнаружил, что почти все время тратится на методы измерения и упорядочивания. Кроме того, я нашел рекомендацию не использовать DataGrid в средствах, которые измеряют его с бесконечностью. Поэтому я решил проблему, но я не могу изменить интерфейс.
Я попытался написать тот же интерфейс без DataGrid: заменил его ItemsControl на TextBlocks. Это решение работает нормально. Но у меня есть несколько подобных интерфейсов, и не очень хорошо писать такой же похожий код. Код, приведенный ниже, является заменой для DataGrid в предыдущем примере:
<ItemsControl ItemsSource="{Binding Path=Items}"
VirtualizingStackPanel.IsVirtualizing="True"
Grid.Row="0" Grid.Column="1">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Type}" />
<!-- Another 20 TextBlocks here -->
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
Так мне нужно реализовать собственный UserControl или найти один готовый к использованию. Может ли кто-нибудь мне что-нибудь предложить? Может быть, обходной или легкий контроль?
Вы можете добавить некоторые примеры кода, как приложение выглядит на момент? Это значительно облегчает объяснение, почему происходят определенные вещи, и каким образом вы должны их менять. На данный момент трудно дать вам хорошие предложения, не догадываясь – Domysee
См. Мой обновленный ответ ниже .... Возможно, вы захотите рассмотреть вопрос о настройке Grid.RowDefinition на Height = «Auto». – phillk6751