Я пытаюсь создать Zoomable/прокручивать «временную шкалу», как компонент. У этого компонента есть элементы, которые я связываю с наблюдением. У него также есть элементы с холстом, содержащим «блоки времени». Тем не менее, я заметил, что когда я добавляю новый предмет, он всегда подходит к верхней части левого холста. Если я увеличиваю /прокручивать или добавляю другой элемент в коллекцию, он переходит в ее правильную позицию.
Не уверен, что происходит, но кажется проблемой времени, когда моя функция для размещения блоков происходит перед какой-то другой функцией макета.
Код: Выделить всё
< /code>
// called after item is added to draw the blocks
private void PositionBlocks()
{
// Clear and re-add so Canvas Left/Width apply
if (PART_Items == null || ItemsSource == null) return;
// Ensure containers are realized before we set positions
PART_Items.UpdateLayout();
foreach (var item in ItemsSource)
{
var container = (FrameworkElement)PART_Items.ItemContainerGenerator.ContainerFromItem(item);
if (container is null) continue; // is null for last item added when initially added
if (item is TimelineBlock b)
{
var left = XOf(b.Start);
var width = Math.Max(1.0, (b.End - b.Start).Ticks * PixelsPerTick);
Canvas.SetLeft(container, left);
Canvas.SetTop(container, 12); // row baseline for blocks
container.Width = width;
container.Height = 24;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... item-added
Мобильная версия