Как заставить ScrollViewer обновлять свой макет после того, как ребенок выполняет RenderTransform? - PullRequest
2 голосов
/ 26 января 2012

У меня есть ScrollViewer, и внутри него я использую элемент управления смешиванием 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 ]

1 голос
/ 27 января 2012

RenderTranforms не влияют на макет. С здесь :

Преобразование рендеринга не восстанавливает размер макета или информацию о размере рендеринга. Преобразования рендеринга обычно предназначены для анимации или применения временного эффекта к элементу. Например, элемент может увеличиваться при фокусировке или наведении, или может дрожать при нагрузке, чтобы привлечь внимание к этой части пользовательского интерфейса.

То, что вы хотите, это LayoutTransform. С здесь :

В отличие от RenderTransform, LayoutTransform повлияет на результаты макета.

и

Примеры сценариев, в которых было бы полезно использовать LayoutTransform: вращение таких элементов, как компоненты меню, из горизонтального положения в вертикальное или наоборот, масштабирование элементов (увеличение) в фокусе, обеспечение режима редактирования и т. Д.

Звучит так, как будто вы используете неправильный элемент макета (в дополнение к неправильному преобразованию), но это трудно сказать, так как вы на самом деле не говорите, что хотите сделать. Причина, по которой он все еще отрезал материал, когда вы выполняли LayoutTransform, возможно, заключалась в том, что не хватало места для элементов, чтобы полностью отобразить в доступном пространстве.

Edit:

Дайте дополнительную информацию, которую я бы предложил, используя пользовательский тип панели: «радиальная» панель. Примеры здесь и здесь .

0 голосов
/ 27 января 2012

Я реализовал взлом на время, чтобы скрыть проблему.Я все еще ищу более правильный подход к решению проблемы, хотя.:)

Я добавил прозрачный прямоугольник в сетку и сделал его ширину равной размеру эллипса + размер (длина) PathListBoxItems, которые были преобразованы.

Область прокрутки теперь позволяетчтобы перейти к областям, которые ранее были обрезаны.

РЕДАКТИРОВАТЬ: я отмечу это как ответ на данный момент, так как это работает.Я просто не чувствую, что это лучшее решение, поэтому я хочу пометить другой ответ как правильный.

...