2016-11-04 14 views
1

У меня есть ListView, используя WrapPanel как его ItemsPanel, и я использую ListViewItem непосредственно в качестве контента. Но когда один ListViewItem.Visibility равен Collapsed, вы все равно можете видеть пространство, в котором оно используется.ListViewItem в WrapPanel, занимающем пространство при свертывании

Во-первых, код XAML образец похож на то, что я использую:

<Grid> 
    <ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemContainerStyle="{DynamicResource ContainerStyle}"> 
     <ListView.Resources> 
      <Style TargetType="{x:Type ListViewItem}" x:Key="ContainerStyle"> 
       <Setter Property="Background" Value="Transparent" /> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ListViewItem}"> 
          <ContentPresenter /> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListView.Resources> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel ItemHeight="200" ItemWidth="200"/> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
     <ListViewItem Margin="10" Visibility="Visible"> 
      <Border Background="Red"/> 
     </ListViewItem> 
     <ListViewItem Margin="10" Visibility="Visible"> 
      <Border Background="Blue"/> 
     </ListViewItem> 
     <ListViewItem Margin="10" Visibility="Visible"> 
      <Border Background="Green"/> 
     </ListViewItem> 
    </ListView> 
</Grid> 

Например, когда все элементы являются видимыми (код выше) у меня есть это: All items are visible

Но если я поменяю первый элемент, чтобы сделать его разрушилась следующим

<ListViewItem Margin="10" Visibility="Collapsed"> 
    <Border Background="Red"/> 
</ListViewItem> 

Результат таков: First item is not visible but uses space

То, что я бы ожидать, будет следующее: Expected result of collapsing

Как таковой я не понимаю, почему он действует как это, кажется, Collapsed вести себя так же, как Hidden. Я применяю его непосредственно к элементу и не вижу, что еще делать.

Я пробовал различные решения, которые я нашел, в первую очередь this one about binding to Visibility in the style и this one going more or less in the same direction, но без успеха, те же результаты.

ответ

0

Принятый ответ на самом деле не обеспечивает решение, которое вместо того, чтобы поставляется в разделе комментариев.

Если вы установите ItemWidth, WrapPanel зарезервирует ItemWidth для всех объектов, привязанных к себе, видимых или нет.

Обходной путь здесь заключается не в том, чтобы установить ItemWidth на WrapPanel, а установить ширину на ItemTemplate.

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 


<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <StackPanel MinWidth="96" /> 
    </DataTemaplate> 
</ItemsControl.ItemTemplate> 
+0

Верно, принимая реальное решение! –

0

Я думаю, что этот вопрос вы видите, связано с тем, что даже разрушилась, ListViewItem еще элемент, и WrapPanel обнаружит 3 предмета, а не 2.

+0

Я понимаю, что вы имеете в виду, но это все дело, я хочу, чтобы иметь пункт, но не видно вообще (я строю поверх существующего программного обеспечения, или я бы просто фильтровать элементы). Например, если я использую StackPanel вместо WrapPanel, он работает; похоже, действительно связано с тем, как работает WrapPanel –

+3

Wrappanel, выделяет набор Width и Height для каждого элемента. Если вы все еще хотите использовать WrapPanel, тогда вы должны установить WIdth и Height для каждого из ListViewItems, вместо использования 'ItemHeight =" 200 "ItemWidth =" 200 "'. Это сделает так, что когда вы свернете элемент, он будет вести себя так, как вы хотите. –

+0

Я думаю, что мой ответ лучше для ремонтопригодности (но фильтрация элементов будет еще лучше), но действительно он работает, если вы задаете высоту и ширину для каждого элемента, так что это похоже на рабочее решение, и я соглашусь с этим :) –

0

Хорошее рабочее решение, как представляется, переопределение методы «Упорядочить» панели в пользовательской панели.

Я работаю на базе этого большого класса AlignableWrapPanel (унаследовав от панели, не WrapPanel), и я получил это работает, заменив это:

var child = children[i]; 
if (child == null) continue; 

с этим:

var child = children[i]; 
if (child == null) continue; 
if (child.Visibility == Visibility.Collapsed) continue; 

Методы: ArrangeOverride, ArrangeLine и MeasureOverride. ArrangeLine немного отличается, но линия с if(child == null) continue; довольно проста в определении; просто добавьте один с Collapsed после этого.

Это решение должно работать с любым

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