Происходит следующее: ваша DockPanel заполнена ItemsControl. Все идет нормально. Тем не менее, ItemsControl внутри использует StackPanel, который не может заполнить по вертикали (по горизонтали, если установлено в Orientation = "Horizontal".
РЕДАКТИРОВАТЬ: Чтобы объяснить, синий фон ... фон ItemsControl по умолчанию установлен на ноль.
Вы знаете, сколько предметов в коллекции?
РЕДАКТИРОВАТЬ 2: Что нужно сделать, когда это динамическая коллекция, добавить следующее:
<ItemsControl ...>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- rest of ItemsControl properties -->
</ItemsControl>
Uniform Grid назначает равное количество пространства каждой ячейке как по горизонтали, так и по вертикали, а ItemsPanel заменяет стандартную StackPanel для позиционирования.
РЕДАКТИРОВАТЬ3: Работа с элементами неравной высоты ... пользовательская панель:
public class CustomPanel : StackPanel
{
protected override Size ArrangeOverride(Size finalSize)
{
var childUIElements = Children.OfType<UIElement>().ToList();
foreach (var child in childUIElements)
{
child.Measure(finalSize);
}
double remainingHeight = finalSize.Height - childUIElements.Sum(c => c.DesiredSize.Height);
if(remainingHeight <= 0)
return base.ArrangeOverride(finalSize);
double yOffset = 0;
foreach (var child in childUIElements)
{
double height = child.DesiredSize.Height + remainingHeight/childUIElements.Count;
child.Arrange(new Rect(0,yOffset,finalSize.Width,height));
yOffset += height;
}
return finalSize;
}
}
Если бы я не сделал слишком много всплывающих окон, это должно сделать хотя бы грубую версию. Если элементы должны быть слишком большими, они будут работать как обычные стековые панели - если нет, то они организуют дочерние элементы, чтобы равномерно распределить оставшееся пространство между ними. Вы можете настроить его, чтобы назначить его по соотношению, если вам это нужно (т. Е. Более крупные блоки получают больше оставшегося пространства).
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ (я думаю :-)) Вам нужно поместить эту пользовательскую панель внутри ItemsPanelTemplate вместо UniformGrid, который я предлагал ранее.