Обновление: Я превратил этот ответ в коде проект статьи здесь: http://www.codeproject.com/KB/WPF/ScatterViewSizing.aspx - проверить, что для большего количества деталей и полного образец кода
Это очень сложно получить права. Некоторое время назад у меня была эта проблема и я попробовал много разных подходов - я даже реализовал собственный ScatterViewItem для обработки автоматической калибровки - но так и не нашел 100% рабочего решения.
Решение, на которое я действительно согласился, решил, что моя основная проблема получения начального размера была правильной, заключалась в создании настраиваемого элемента управления, который использовал прикрепленные свойства, чтобы установить размер его родительского ScatterViewItem при его создании. Полный код для этого - путь к большому, чтобы разместить здесь, но я попытаюсь объяснить суть этого, чтобы вы начали.
Итак, всякий раз, когда я добавлял материал в свой ракурс (через привязку данных), мой элемент itemtemplate установил содержимое ScatterViewItem моему элементу под названием «PopupWindow» (который был получен из UserControl). PopupWindow определил прикрепленное свойство InitialSizeRequest
(типа Size), которое оно будет искать в своем дочернем элементе. В своем обработчике событий Loaded
он будет искать визуальное дерево вверх, чтобы найти ScatterViewItem, а затем установить его размер соответствующим образом.
Сформированный визуальное дерево будет выглядеть следующим образом:
ScatterView
'- ScatterViewItem
'- PopupWindow
'- ActualContent (datatemplate)
На фактическое содержание, они заявляют, их размер примерно так:
<UserControl x:Class="...."
...
localview:PopupWindow.InitialSizeRequest="450,400" />
Чтобы разжиться фактическое содержание от PopupWindow , Я использовал код ниже (ошибка проверки опущена). Это выполняется в Loaded
случае PopupWindow:
// GuiHelpers is a helper class I built to find elements in the visual tree
// c_contentHolder is a ContentControl which will hold the actual content
var presenter = GuiHelpers.GetChildObject<ContentPresenter>(c_contentHolder);
// It seems it's safe to assume the ContentPresenter will always only have one
// child and that child is the visual representation of the actual content.
var child = VisualTreeHelper.GetChild(presenter, 0);
Size requestedSize = PopupWindow.GetInitialSizeRequest(child);
// Now use requestedSize to set the size of the parent ScatterViewItem
var svi = GuiHelpers.GetParentObject<ScatterViewItem>(this, false);
svi.Width = requestedSize.Width;
svi.Height = requestedSize.Height;
Надеюсь, это должно вам начать работу. Прошу прокомментировать, если вам нужны дополнительные объяснения.