2015-08-26 1 views
0

Я переношу приложение с Win8.1 на Win10 (из-за изменений области, это полная перезапись для UAP) и столкнулся с проблемой.Windows 10 UAP GridView ItemsPanel не правильно обертывается

Мы пытаемся отобразить несколько сотен элементов, сгруппированных по дате их создания (год и месяц) в GridView. На W8.1 было легко создать GridView с CollectionViewSource, установить GroupingStyle, и он будет обертывать элементы, чтобы мы могли прокручивать по вертикали.

Однако на W10 по какой-либо причине все определенные панели игнорируют это и обертывают элементы по горизонтали, создавая списки вместо реальных горизонтально прокручиваемых gridviews. Это не то поведение, которое я хочу.

Я пробовал с VariableSizedWrapGrid, который может это сделать, но только статически. Ему нужно значение MaximumRowsOrColumns, которое, если я установлю, могу добиться обертывания на заданной высоте. Поскольку мои позиции фиксированной высоты (для элементов VSWG ItemsHeight и ItemsWidth установлено значение 90, мои позиции - 1 столбец 3), это приводит к вертикальной прокрутке сетки, если высота окна меньше, чем количество, необходимое для размещения предметов. Я бы хотел, чтобы элементы автоматически перестраивались, поэтому вертикальная прокрутка не происходит.

Есть ли способ достичь первоначального поведения W8.1 в панелях в Win10?

+0

На самом деле, 'GridView' всегда был предназначен для отображения горизонтально уложенных элементов, в то время как' ListView' для элементов с вертикальной укладкой. –

+0

Джастин, я это понимаю, но в Win10 UAP панель действует, как если бы она не определяла высоту, на которую она может растянуться, и перетягивать. – fonix232

ответ

1

Если бы на тот же вопрос на прошлой неделе и удалось исправить это, поймав событие SizeChanged в GridView и предоставив базовую переменную VariableSizedWrapGrid максимальную высоту, равную фактическому весу GridView.

Основном это было бы как:

private void GridView_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    var innerVariableSizedWrapGrid = ControlHelper.FindChild<VariableSizedWrapGrid>(((GridView)AssociatedObject)); 

    if (innerVariableSizedWrapGrid != null) 
    innerVariableSizedWrapGrid.MaxHeight = ((GridView)AssociatedObject).ActualHeight; 
} 

(ControlHelper является VisualTree вспомогательного класса, чтобы найти ребенок/родитель Многих примеров доступен в Интернете, спросите, если вы хотите мою версию.)

Моего GridView выглядит как это: (я опустил его стиль и ItemSource)

<GridView 
    ScrollViewer.HorizontalScrollBarVisibility="Auto" 
    ScrollViewer.HorizontalScrollMode="Enabled" 
    ScrollViewer.VerticalScrollMode="Disabled" 
    SizeChanged="GridView_SizeChanged"> 
    <GridView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VariableSizedWrapGrid Orientation="Horizontal" /> 
    </ItemsPanelTemplate> 
    </GridView.ItemsPanel> 
</GridView> 

виду, что ориентация по умолчанию в VariableSizedWrapGrid был изменен с Vertica l до горизонтального (для настольных приложений) в W10. И ScrollViewer его свойства. Они будут уверены, что вы не можете прокручивать по вертикали.

О, кстати, я вижу, вы тоже используете группировку, у меня было еще несколько проблем с этим. Кажется, что первая ширина GroupItem используется для всех GroupItems ... В конце концов я смог ее исправить. Проверьте мои blog для более подробной информации.

Смежные вопросы