2013-09-21 3 views
0

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

Пример макета будет:

+--------+ +--------+ 
| img1 | | img2 | 
|  | |  | 
+--------+ |  | 
+--------+ |  | 
| img3 | +--------+ 
|  | +--------+ 
|  | | img4 | 
|  | |  | 
+--------+ |  | 
      +--------+ 

Я нашел проект, который показывает сетку изображений, называемый PhotoHubSample (от http://code.msdn.microsoft.com/wpapps/PhotoHub-Windows-Phone-8-fd7a1093), однако это использует последовательную ширину и высоту - ведет меня верить я не могу делать то, что хочу.

Я не вижу других примеров Windows Phone 8, однако, если вы хотите увидеть пример реального мира - приложение Pinterest на iPhone отображает этот список ... есть ли способ сделать это в XAML ? Я не ставлю 100% на использование LongListSelector, если есть альтернатива.

ответ

1

Я пробовал VariableSizedWrapGrid и WrapPanel, но оба требуемые известные высоты и ширину (или их пропорции). Поскольку я знал ширину моего изображения (половину ширины экрана на телефоне), я бы оценил высоту изображения, чтобы обеспечить правильное масштабирование. Это означало, что высота была переменной.

Для этого я создал ViewModel, у которого были два источника изображения: LeftImage и RightImage, а также вычисленный «YOffset». Теперь каждый элемент в моем LongListSelector будет иметь следующий XAML;

<phone:LongListSelector.ItemTemplate> 
     <DataTemplate> 
      <Grid Margin="0,0,0,17"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="14" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Image Source="{Binding LeftImageUri}" Margin="0,0,0,0" HorizontalAlignment="Left" Stretch="None"/> 
       <Canvas Grid.Column="2"> 
        <Image Source="{Binding RightImageUri}" Stretch="None" Margin="{Binding YOffset, Converter={StaticResource ThicknessTopConverter}}"/> 
       </Canvas> 
      </Grid> 
     </DataTemplate> 
    </phone:LongListSelector.ItemTemplate> 

Я использовал IValueConverter создать Thickness объект, необходимый для вертикального смещения второго изображения и обернуто это в Canvas так, чтобы она могла распространиться на границах Grid.

Чтобы сгенерировать объекты ViewModel, я беру список изображений и выполняю простой алгоритм сортировки bin между левыми и правыми сторонами, убедившись, что у меня всегда есть изображение слева для соответствия. Я сохраняю счетчик смещения и правильно устанавливаю каждый элемент коллекции ViewModel.

Это немного хакерский, поскольку это не чистый XAML, и я уверен, что могу превратить его в правильный контроль, но это отлично подходит для одного списка прокрутки, в котором я нуждаюсь. Я также получаю все преимущества от LongListSelector, я буду внедрять бесконечную прокрутку, поэтому все, что мне нужно отслеживать в ViewModel, - это текущее смещение.

Вид на то, как он выглядит, с изображениями 400 и 600 пикселей ниже (фактический снимок экрана);

WP8 with Two Column Layout

+0

Ваше решение отлично выглядит! Пользовательский контрольный пример или пробный пример на GitHub был бы замечательным ... – Depechie

+0

Спасибо! Хорошая идея - я уверен, что (несколько грязный) код улучшится, поскольку я уберу некоторые ошибки в ближайшие несколько недель. Похоже, мне нужен список в двух местах, так что, возможно, появится «UserControl» ... спасибо за все ваши предложения, и я обновлю этот ответ, когда приступлю к загрузке образца. – SimonM

0

В инструменте Kinnara wp имеется средство управления сеткой с переменным размером ... возможно, это может помочь? Вы можете получить его at github here...

+0

Спасибо за предложение - я посмотрю в ближайшие несколько дней, если это может обрабатывать мои потребности. Надеюсь, он по-прежнему будет вести себя с длинными списками. Если это окажется не особенно отзывчивым, мне придется вернуться к простому списку столбцов. – SimonM

+0

Держите нас в курсе! – Depechie

+0

К сожалению, это не работает для того, что мне нужно ... «ItemHeight» и «ItemWidth» должны быть установлены на «VariableSizedWrapGrid», поэтому это отличный контроль для известных пропорций (например, экран «Пуск» в Windows 8) но я не знаю высоты моих изображений до времени исполнения, и они меняются, что ломает расчет макета в этом элементе управления. Спасибо за предложение. Любые другие идеи? – SimonM

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