WPF ListView: представление значков в одном столбце - PullRequest
1 голос
/ 13 сентября 2011

У меня странная проблема ...

То, что я пытаюсь сделать, вполне стандартно, я полагаю: разрешить пользователю переключаться между Grid и режимы иконок в моем ListView. Все идет хорошо, но ... В представлении «Иконка» вместо того, чтобы показывать элементы в упаковывающих строках, они отображаются в одном столбце, причем каждый элемент занимает всю ширину представления. И я не могу понять, что именно не так ...: - (

(Я еще не заработал достаточно XP на этом форуме, и он не позволит мне публиковать изображения; вместо этого я дам ссылки на скриншоты)

Что я хочу: http://i.stack.imgur.com/jYhVx.png

Что у меня есть: http://i.stack.imgur.com/PeAae.png

Вот определение стиля IconView (в Themes \ Generic.xaml):

<Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type l:IconView}, ResourceId=IconViewStyle}" 
       TargetType="{x:Type ListView}" 
       BasedOn="{StaticResource {x:Type ListBox}}">
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="ItemContainerStyle" Value="{Binding (ListView.View).ItemContainerStyle, RelativeSource={RelativeSource Self}}"/>
    <Setter Property="ItemTemplate" Value="{Binding (ListView.View).ItemTemplate, RelativeSource={RelativeSource Self}}"/>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <WrapPanel IsItemsHost="True"
                           Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
                           ItemWidth="{Binding (ListView.View).ItemWidth, RelativeSource={RelativeSource AncestorType=ListView}}"
                           MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}"
                           ItemHeight="{Binding (ListView.View).ItemHeight, RelativeSource={RelativeSource AncestorType=ListView}}"/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

Используется в соответствующем классе управления:

public class IconView : ViewBase
{
    public static readonly DependencyProperty ItemContainerStyleProperty =
      ItemsControl.ItemContainerStyleProperty.AddOwner(typeof(IconView));

    public Style ItemContainerStyle
    {
        get { return (Style)GetValue(ItemContainerStyleProperty); }
        set { SetValue(ItemContainerStyleProperty, value); }
    }

    public static readonly DependencyProperty ItemTemplateProperty =
        ItemsControl.ItemTemplateProperty.AddOwner(typeof(IconView));

    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    public static readonly DependencyProperty ItemWidthProperty =
        WrapPanel.ItemWidthProperty.AddOwner(typeof(IconView));

    public double ItemWidth
    {
        get { return (double)GetValue(ItemWidthProperty); }
        set { SetValue(ItemWidthProperty, value); }
    }


    public static readonly DependencyProperty ItemHeightProperty =
        WrapPanel.ItemHeightProperty.AddOwner(typeof(IconView));

    public double ItemHeight
    {
        get { return (double)GetValue(ItemHeightProperty); }
        set { SetValue(ItemHeightProperty, value); }
    }


    protected override object DefaultStyleKey
    {
        get
        {
            return new ComponentResourceKey(GetType(), "IconViewStyle");
        }
    }
}

И вот как все это используется в View.xaml (я опущу DataTrigger, который назначает {DynamicResource IconView} для представления ListView, для краткости):

<DataTemplate x:Key="IconViewItemTemplate">
    <StackPanel Height="170" Width="170">
        <Grid Width="150" Height="150" HorizontalAlignment="Center">
            <Image Source="{Binding DefaultPicture.Path}" Margin="6,6,6,9"/>
        </Grid>
        <TextBlock Text="{Binding ID}" FontSize="13" HorizontalAlignment="Center" Margin="0,0,0,1" />
    </StackPanel>
</DataTemplate>

<localControls:IconView x:Key="IconView"  
                        ItemTemplate="{StaticResource IconViewItemTemplate}" 
                        ItemWidth="180"/>

Я схожу с ума ... И, чтобы добавить к моему разочарованию, Снуп не видит мое заявление: - (

Пожалуйста, помогите! ; -)

Большое спасибо, Alex

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Ну, я нашел виновника.Оказывается, что проблема не в фрагментах, которые я включил в вопрос, а в том, что я пропустил - определение ListView.GroupStyle в самом ListView.После удаления список отображается так, как я ожидаю.

Спасибо всем, кто рассмотрел мой вопрос!

Алекс

0 голосов
/ 13 сентября 2011

Большинство ваших привязок могут быть просто повреждены: (ListView.View).ItemWidth

Вышеуказанный путь интерпретируется иначе, чем пути, которые вы используете в StoryBoard.TargetProperty, например.Если вы используете круглые скобки в привязке, это сигнализирует о привязке к присоединенному свойству.

С MSDN , выделено:

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

Поэтому измените их соответственно в приведенном выше примере: View.ItemWidth

...