Это не решит вашу проблему, но я уверен, что это упростит ее:
Попробуйте определить DataTemplate
, который выглядит примерно так:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" SharedSizeGroup="Top"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto" SharedSizeGroup="Bottom"/>
</Grid.RowDefinitions>
<ContentControl Grid.Row="0" Content="{Binding TopAnnotations}/>
<Rectangle Fill="Black" Grid.Row="1" Margin="0,4,0,4"/>
<ContentControl Grid.Row="1" Height="10" Content="{Binding GraphicObject}"/>
<ContentControl Grid.Row="2" Content="{Binding BottomAnnotations}"/>
</Grid>
Теперь создайте ItemsControl
, ItemsPanelTemplate
которого является горизонтальным WrapPanel
, со свойством Grid.IsSharedSizeScope
, установленным в True. Вам, конечно, также нужно будет определить шаблоны данных для того, что содержат свойства аннотации и графического объекта.
У вас все еще есть проблема, заключающаяся в том, что когда элементы в WrapPanel
переносятся, объекты над и под временной шкалой имеют одинаковый отступ, независимо от того, сколько им фактически нужно разместить в текущей строке WrapPanel
. Таким образом, чтобы получить эффект, который, я думаю, вы ищете, вам все равно придется поэкспериментировать с мерой и аранжировкой - в основном, вместо создания одного WrapPanel
, вы создадите что-то, что поместит эти элементы в StackPanel
в каждой «строке», каждая из которых является собственной областью общего размера. Но на самом деле измерение и расположение высот элементов шкалы времени - это не то, о чем вам нужно беспокоиться. Вам нужны только их ширины (чтобы ваша логика могла определить, когда обернуть). Grid
позаботится о расчете высоты для вас.