Silverlight WrapPanel Children

Как лучше всего добавить детей в WrapPanel в silverlight? Я использую C # и читаю объект JSON, содержащий изображения с эскизами и связанную информацию.

Конечная цель - получить сетку миниатюр (13 больших пальцев по горизонтали 950 пикселей и 6 больших пальцев по вертикали).


person Community    schedule 26.01.2009    source источник


Ответы (3)


Когда вы сталкиваетесь с добавлением элементов в код, обычно есть способ получше.

Как насчет создания ListBox и установки его ItemsSource в свой список (или привязки его к DataContext). Создайте DataTemplate для отображения миниатюры + информации, а затем (это важная часть) создайте ItemsPanelTemplate с помощью WrapPanel.

<Grid x:Name="ImageThumbnails">
    <ListBox 
        ItemsSource="{Binding}" 
        Width="950"
        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
        >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <Image Source="{Binding Thumbnail}" Width="80" Height="60"/>
                    <TextBlock Text="{Binding ImageName}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
     </ListBox>
</Grid>

Затем в вашем коде, как только вы получите данные из вызова JSON:

this.ImageThumbnails.DataContext = thumbnailListFromJSON;

Теперь, если ваш список является ObservableCollection, любые изменения в списке будут автоматически отражаться в вашем пользовательском интерфейсе.

(Приведенный выше код следует рассматривать как псевдокод - очевидно, вам придется изменить его, чтобы отразить вашу структуру данных)

Изменить: добавлен ScrollViewer.HorizontalScrollBarVisibility = "Disabled" в ListBox. Это важно, потому что это останавливает бесконечно расширяющееся окно scrollviewer в горизонтальном направлении. Без этого WrapPanel становится списком с одной строкой.

person geofftnz    schedule 27.01.2009

WrapPanel является производным от Panel, поэтому вы можете просто использовать Children.Add (control). WrapPanel позаботится обо всем макете, это его работа.

person Maurice    schedule 26.01.2009

UniformGrid идеально подходит для этой ситуации. К сожалению, это не часть структуры Silverlight. Однако есть несколько доступных портов версии WPF.

http://www.jeff.wilcox.name/2009/01/uniform-grid/

person cosullivan    schedule 05.05.2009