Это очень сложная задача для решения. Во-первых, важно понять, что на самом деле делает RenderTransform
. Он преобразует то, что было отрендерено. Каждый пиксель перемещается в новую позицию на основе того, что в конечном итоге является довольно простым матричным вычислением. Это происходит довольно поздно во всем процессе рендеринга. Эллипс уже обрезан до преобразования применяется.
Механизм компоновки проходит две фазы: мера , где элементы соперничают за свои предпочтительные условия (эллипс хочет, чтобы поле размером 400 x 400 отображалось), затем упорядочивает , где элементы их контейнеры сказали, что у них есть на самом деле.
В случае, когда для ширины столбца установлено значение «Авто», Grid
уступает запросу UserControl
во время фазы измерения для блока ширины 400. Эллипс отображается без какого-либо отсечения, потому что блок достаточно большой затем RenderTransform
переводит результаты на новую позицию.
В случае, когда ширина столбца равна «*», Grid
предоставит UserControl только поле ширины, определяемое долей этого столбца в доступной ширине, даже если это меньше, чем UserControl
требуемая ширина. В этом случае эллипс визуализируется, но должен обрезаться до границы указанного поля. , а затем , что этот обрезанный эллипс переведен на новую позицию.
Чтобы иметь возможность вырваться из данного поля, элемент может указывать отрицательные поля. Это приведет к увеличению поля для рендеринга. Например, если контейнер указывает, что ширина составляет всего 200, а UserControl
имеет поле -100, то фактическое поле отображается в ширину 400 пикселей.
Чтобы заставить это работать должным образом, в то же время поддерживая динамическое упорядочение контента, может быть немного проб и ошибок.