2010-11-15 3 views
7

Ich habe eine App mit mehreren ListView-Steuerelementen, wo eine Anforderung besteht, dass die Elemente in der ListView vollständig sichtbar sein müssen. Es sollte niemals ein Teil von ListViewItem in der Liste angezeigt werden. Wenn der Benutzer den ScrollViewer an einer Position freigibt, an der ein Teilelement angezeigt wird, sollte die Liste "einrasten" und sich selbst korrigieren, sodass nur vollständige Elemente angezeigt werden.WPF ListView Zeige immer komplette Artikel

Hat jemand das schon mal gemacht? Ich denke, ich muss ListView und/oder ScrollViewer überlasten, um dies zu tun. Ich suche nach Vorschlägen, wie ich das angehen kann. Vielen Dank.

Hier ist eine meiner Listen:

<ctrls:SnapList x:Name="PART_ProductList" 
              ScrollViewer.CanContentScroll="False" 
              ScrollViewer.VerticalScrollBarVisibility="Auto" 
              ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
              ItemContainerStyle="{StaticResource ProductFinderItem}" 
              Canvas.Top="373" Canvas.Left="75" 
              Height="910" Width="900" > 

          <ctrls:SnapList.ItemsPanel> 
            <ItemsPanelTemplate> 
             <VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard" /> 
           </ItemsPanelTemplate> 
          </ctrls:SnapList.ItemsPanel> 

          <ctrls:SnapList.Template> 
            <ControlTemplate> 
            <ScrollViewer x:Name="Scroller" VerticalAlignment="Top" CanContentScroll="True" Style="{StaticResource VertScrollViewer}" Focusable="false" > 
               <ItemsPresenter /> 
              </ScrollViewer> 
            </ControlTemplate> 
          </ctrls:SnapList.Template> 
         </ctrls:SnapList> 
+0

Welchen ScrollViewer sprechen Sie? Haben Sie einen ScrollViewer in einem Grid (oder etwas), das mehrere ListViews enthält, und wenn dieser ScrollViewer seine Position ändert, möchten Sie sicherstellen, dass alle ListViewItems sichtbar sind? Für eine ListView selbst kann ich nicht einmal Teilelemente anzeigen. –

+0

Ich spreche über den ScrollViewer in der ControlTemplate der Liste. Ich habe den XAML für eine der Listen zu meinem Beitrag hinzugefügt. Der ScrollViewer, von dem ich spreche, ist der mit x: Name = "Scroller" im Beispiel XAML. –

+0

* ListBox * hat das exakt gleiche Verhalten standardmäßig. Können Sie eine * ListBox * anstelle einer * ListView * verwenden? – decyclone

Antwort

0

Haben Sie ListView.ScrollIntoView versucht?

+0

ScrollIntoView scrollt ein Element in die Ansicht, aber es stellt nicht sicher, dass nur ganze Elemente in einer Liste sichtbar sind. Selbst wenn dies der Fall wäre, müsste ich immer noch wissen, wann ich es aufrufen soll (z. B. wenn Teilstücke angezeigt werden). –

+0

Ihre aktuelle Frage ist klarer. Früher war es eher so, dass Sie wollten, dass Ihre Auswahl vollständig sichtbar ist. Stattdessen möchten Sie keine Teilelemente in Ihrer Liste anzeigen. Recht? – Yogesh

+0

Rechts. Meine Frage ist die gleiche wie ich ursprünglich gepostet habe. :) –

1

Ich glaube, Sie suchen die ScrollViewer.CanContentScroll Property

Wenn Sie die maximale Größe des Elements im Listview wissen, stellen Sie sicher, dass die Listview-Height ist die gleiche Größe oder ein Vielfaches der Artikelhöhe.

Arbeitsbeispiel:

<ListView ScrollViewer.CanContentScroll="True" 
      Height="200"> 

    <ListBoxItem Height="50" 
        Content="Test1" /> 
    <ListBoxItem Height="50" 
        Content="Test2" /> 
    <ListBoxItem Height="50" 
        Content="Test3" /> 
    <ListBoxItem Height="50" 
        Content="Test4" /> 
    <ListBoxItem Height="50" 
        Content="Test5" /> 
    <ListBoxItem Height="50" 
        Content="Test6" /> 
    <ListBoxItem Height="50" 
        Content="Test7" /> 
    <ListBoxItem Height="50" 
        Content="Test8" /> 
    <ListBoxItem Height="50" 
        Content="Test9" /> 
    <ListBoxItem Height="50" 
        Content="Test10" /> 

</ListView> 

Inhalt in einem Scrollviewer kann in Bezug auf den physikalischen Einheiten oder logischer Einheiten gescrollt werden. Physische Einheiten sind geräteunabhängige Pixel. Logische Einheiten werden zum Scrollen von Objekten in einem ItemsControl verwendet. Das Standardverhalten des ScrollViewers besteht darin, physische Einheiten zu seinen Inhalt zu scrollen. Wenn der CanContentScroll jedoch auf true festgelegt ist, kann der Inhalt logische Einheiten zum Scrollen verwenden. Für Beispiel verwenden ListBox, ListView und andere Steuerelemente, die von ItemsControl erben, logische Einheiten zum Scrollen. Wenn CanContentScroll den Wert "True" hat, sind die Werte der ExtentHeight-, ScrollableHeight-, ViewportHeight- und VerticalOffset-Eigenschaften die Anzahl der Elemente anstelle der physischen Einheiten .

Wenn Sie physische Scrollen statt logische Scrollen erfordern, wickeln das Host-Panel-Element in einem Scroll und legen Sie seine CanContentScroll Eigenschaft auf false. Physisches Scrollen ist das Standard-Scroll-Verhalten für die meisten Panel-Elemente.