У меня есть окно, содержащее ItemsControl
, которое может иметь переменное количество элементов управления внутри.Чтобы учесть случай, когда в высоту окна помещается больше, чем уместится, я обернул его в ScrollViewer
, чтобы полоса прокрутки отображалась, когда количество элементов было больше, чем соответствовало бы доступной высоте.
Теперь проблема в том, что иногда в ItemsControl
ничего не будет отображаться, а иногда будет.Поэтому я установил высоту строки сетки на Auto
, чтобы позволить ItemsControl
исчезать, когда он пуст, или увеличиваться при необходимости.Однако это означает, что строка занимает столько высоты, сколько ей нужно, даже если она превышает высоту окна, и вертикальная полоса прокрутки никогда не отображается.
Вот пример XAML для образца окна, демонстрирующего проблему...
<Window x:Class="DuplicateCustomerCheck.TestScrollViewerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test Scroll Viewer Window"
Height="450"
Width="200">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Name="N"
TextChanged="TextBoxBase_OnTextChanged"
Grid.Row="0"
Margin="3" />
<Grid Margin="3"
Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Text="Possible duplicate of..."
Margin="3" />
<ScrollViewer VerticalScrollBarVisibility="Visible"
Grid.Row="1">
<ItemsControl Name="MatchingNames"
ItemsSource="{Binding MatchingNames, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Item}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
<TextBlock Grid.Row="2"
Margin="3"
Text="Stuff at the bottom" />
</Grid>
</Window>
Для демонстрации, вот обработчик события кнопки, который позволяет мне проверять различное количество элементов (обратите внимание, что это код проверки, поэтому нет проверки ошибок и т. Д.) ...
private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e) {
MatchingNames.ItemsSource = Enumerable
.Range(0, int.Parse(N.Text))
.Select(n1 => new {
Item = "Button " + n1
});
}
Если я изменю высоту второй строки сетки на *
, тогда она будет работать нормально, но это означает, что ItemsControl
постоянно виден, чего я не хочу.Он должен отображаться только при наличии некоторых элементов.
Я попробовал поведение ScrollViewerMaxSizeBehavior
из этого сообщения в блоге ( код здесь ), но это не такНе имеет значения.
Кто-нибудь знает, как я могу позволить ItemsControl
занимать столько вертикального пространства, сколько ему нужно, включая ноль, но не расти выше, чем может поместиться в окне?