WPF: используйте другой шаблон в зависимости от размера и количества элементов - PullRequest
2 голосов
/ 26 августа 2010

Я пытаюсь понять, как я могу изменить шаблон в зависимости от размера и количества элементов.Это очень похоже на ленту, которая динамически изменяется в зависимости от размера, или миниатюру программ Windows 7.

В данном случае это ItemTemplate ListBox, и я хочу уменьшить размер изображения или нетпоказать его, а не полосы прокрутки.

<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Title}" />                        
                <Image Source="{Binding ImageUrl}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Вы можете установить стиль в ListBox, который переключает ItemTemplate на основе количества элементов.

<ListBox ItemsSource="{Binding Items}">
    <ListBox.Resources>
        <local:SizeConverter x:Key="SizeConverter"/>
        <DataTemplate x:Key="SmallTemplate"></DataTemplate>
        <DataTemplate x:Key="MediumTemplate"></DataTemplate>
        <DataTemplate x:Key="LargeTemplate"></DataTemplate>
    </ListBox.Resources>
    <ListBox.Style>
        <Style TargetType="ListBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Small">
                    <Setter Property="ItemTemplate" Value="{StaticResource SmallTemplate}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Medium">
                    <Setter Property="ItemTemplate" Value="{StaticResource MediumTemplate}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Items.Count, Converter={StaticResource SizeConverter}}" Value="Large">
                    <Setter Property="ItemTemplate" Value="{StaticResource LargeTemplate}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.Style>            
</ListBox>

SizeConverter будет IValueConverter, который возвращает категорию размера на основе входящего количества,Метод может быть что-то вроде этого:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    int count = (int)value;
    if (count < 4) return "Large";
    if (count < 12) return "Medium";            
    return "Small";
}
3 голосов
/ 26 августа 2010

Возможно, вы захотите использовать функциональность DataTemplateSelector в WPF:

Из ссылки:

Как правило, вы создаете DataTemplateSelector, когда у вас есть более одного DataTemplate для объекты того же типа, и вы хотите предоставить свою собственную логику, чтобы выбрать DataTemplate для применения на основе свойства каждого объекта данных. Заметка что если у вас есть объекты разных типы вы можете установить DataType свойство на шаблоне данных. если ты делать это тогда нет необходимости создать DataTemplateSelector. Кроме того, если у вас есть объекты того же типа, но с разными свойства, вы также можете рассмотреть используя DataTrigger или данные конвертер. Для получения дополнительной информации см. Обзор шаблонов данных.

Или, как уже упоминалось выше, DataTrigger может быть полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...