Как заставить ScrollViewer обновлять свой макет после того, как ребенок выполняет RenderTransform?
У меня есть ScrollViewer
и в нем я использую Blend control PathListBox
чьи дети я вращаю и масштабирую RenderTransfrom
,
К сожалению, ScrollViewer
размеры до размера моего Ellispe
(элемент управления, который я использую в качестве моего пути), и я не могу понять, как получить ScrollViewer's
окно просмотра, чтобы включить весь контроль (все PathListBoxItem
с.)
Я думал, что причина, по которой он не будет соответствовать размеру моего PathListBox, была из-за моего RenderTransform
, но я попытался заменить его на LayoutTransform
и это все еще отрезает вещи (не так плохо, хотя, но LayoutTransform
это не то что мне нужно).
Мой Xaml выглядит примерно так (для простоты я оставил некоторые вещи):
<ScrollViewer>
<Grid>
<Ellipse ... />
<ec:PathListBox ...>
<ec:PathListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RenderTransform>
<TransformGroup>
<RotateTransform Angle="-90" />
<TranslateTransform X="{Binding ...}"
</TransformGroup>
<Grid.RenderTransform>
<Rectangle ... />
</Grid>
</DataTemplate>
</ec:PathListBox.ItemTemplate>
<ec:PathListBox.LayoutPaths>
<ec:LayoutPath SourceElement="{Binding ElementName=ellipse}" ... />
</ec:PathListBox.LayoutPaths>
</ec:PathListBox>
</Grid>
</ScrollViewer>
2 ответа
Я реализовал взлом на время, чтобы скрыть проблему. Я все еще ищу более правильный подход к решению проблемы, хотя.:)
Я добавил прозрачный прямоугольник в сетку и сделал его ширину равной размеру эллипса + размер (длины) PathListBoxItems, которые были преобразованы.
Область прокрутки теперь позволяет прокручивать области, которые были ранее обрезаны.
РЕДАКТИРОВАТЬ: Я отмечу это как ответ на данный момент, так как это работает. Я просто не чувствую, что это лучшее решение, поэтому я хочу пометить другой ответ как правильный.
RenderTranforms не влияют на макет. Отсюда:
Преобразование рендеринга не восстанавливает размер макета или информацию о размере рендеринга. Преобразования рендеринга обычно предназначены для анимации или применения временного эффекта к элементу. Например, элемент может увеличиваться при фокусировке или наведении, или может дрожать при нагрузке, чтобы привлечь внимание к этой части пользовательского интерфейса (UI).
То, что вы хотите, это LayoutTransform. Отсюда:
В отличие от RenderTransform, LayoutTransform будет влиять на результаты макета.
а также
Примеры сценариев, в которых было бы полезно LayoutTransform, включают в себя: вращающиеся элементы, такие как компоненты меню, от горизонтального до вертикального или наоборот, масштабирование элементов (увеличение) в фокусе, обеспечение режима редактирования и т. Д.
Похоже, вы используете неправильный элемент макета (в дополнение к неправильному преобразованию), но это трудно сказать, так как вы на самом деле не говорите, что вы хотите сделать. Причина, по которой он все еще отрезал материал, когда вы выполняли LayoutTransform, возможно, заключалась в том, что не хватало места для элементов, чтобы полностью отобразить в доступном пространстве.
Редактировать:
Дайте дополнительную информацию, которую я бы предложил, используя пользовательский тип панели: "радиальная" панель. Примеры здесь и здесь.