На WP8 я хотел бы отобразить список на странице следующим образом:
Я знаю, что могу легко сделать это с помощью WP8.1 и элемента управления VariableSizedWrapGrid. Но мне нужно заставить его работать на WP8.0. Поэтому я пробую набор инструментов от Kinnara: https://www.nuget.org/packages/WPtoolkit.Kinnara/, который содержит VariableSizedWrapGrid.
Я могу сделать отображение, которое хочу (см. снимок экрана), но я не могу использовать его в LongListSelector или ListBox в качестве ItemPanelTemplate.
Вот код, который я пробовал (он вдохновлен методом, который работает в Windows 8, но, к сожалению, не работает в WP8), а также из этого сообщения в блоге: http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2012/09/14/windows-8-xaml-and-displaying-multiple-sized-items.aspx.
<local:SpecificListBox x:Name="LB_Wings" ItemTemplate="{StaticResource IT_Wings}" >
<local:SpecificListBox.ItemsPanel>
<ItemsPanelTemplate>
<toolkit:VariableSizedWrapGrid ItemWidth="100" ItemHeight="100" MaximumRowsOrColumns="4"></toolkit:VariableSizedWrapGrid>
</ItemsPanelTemplate>
</local:SpecificListBox.ItemsPanel>
<local:SpecificListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="toolkit:VariableSizedWrapGrid.RowSpan" Value="{Binding ItemSize}" />
<Setter Property="toolkit:VariableSizedWrapGrid.ColumnSpan" Value="{Binding ItemSize}" />
</Style>
</local:SpecificListBox.ItemContainerStyle>
</local:SpecificListBox>
шаблон данных:
<DataTemplate x:Key="IT_Wings">
<Grid Margin="0,0,12,12" >
<Image Source="{Binding BI_List}" Stretch="UniformToFill" </Image>
</Grid>
</DataTemplate>
SpecificListBox — это просто класс, который наследует ListBox и переопределяет метод PrepareContainerForItemOverride:
class SpecificListBox : ListBox
{
public SpecificListBox() { }
protected override void PrepareContainerForItemOverride(System.Windows.DependencyObject element, object item)
{
dynamic lateBoundItem = item;
int sizeFactor = (int)lateBoundItem.ItemSize;
element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, sizeFactor);
element.SetValue(VariableSizedWrapGrid.RowSpanProperty, sizeFactor);
base.PrepareContainerForItemOverride(element, item);
}
}
Теперь в коде позади я просто заполняю LB_Wings списком элементов (которые имеют свойство ItemSize):
LB_Wings.ItemsSource = listOfItems; //a list of items that have the ItemSize property.
К сожалению, я получаю сообщение об ошибке: «Невозможно создать экземпляр типа: SpecificListBox», когда я инициализирую свою страницу.
Думаю, я близок к решению. Может ли кто-нибудь помочь мне сделать такое отображение (что кажется естественным на WP8), но с помощью ListBox и ItemPanelTemplate?
Большое спасибо