2009-08-12 6 views
10

Ich habe eine ListBox, die eine Liste von WPF-Steuerelemente angezeigt. Mein Problem ist, dass der vertikale Bildlauf Show ist aber deaktiviert, auch wenn es genügend Elemente, die die ListBox scrollbaren sein sollten. Eine andere möglicherweise relevante Tatsache ist, dass dies in einem Integration.ElementHost enthalten ist.Scrollbar in Listbox arbeiten nicht

WPF noobie, Jim

ist die XAML für die ListBox:

// for brevity I removed the Margin and Tooltip attributes 

    <Grid x:Class="Xyzzy.NoteListDisplay" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Name="stackPanel" Orientation="Vertical" 
       ScrollViewer.VerticalScrollBarVisibility="Visible"> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox Name="AllRecent" IsChecked="False" >View All Recent</CheckBox> 
      <CheckBox Name="AscendingOrder" IsChecked="False">Descending Order</CheckBox> 
      <Button Name="btnTextCopy" Click="btnCopyText_Click">Copy All</Button> 
     </StackPanel> 
     <ListBox Name="NoteList" 
       ScrollViewer.CanContentScroll="True" 
       ScrollViewer.VerticalScrollBarVisibility="Visible"> 
     </ListBox> 
     </StackPanel> 
    </Grid> 

Und das XAML für die in jedem ListBox Element angezeigt Kontrolle:

<UserControl x:Class="Xyzzy.NoteDisplay" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <StackPanel Orientation="Vertical"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Name="Heading" FontSize="10">Note Heading</TextBlock> 
      <Button Name="btnCopyText" Height="20" FontSize="12" 
          Click="btnCopyText_Click">Copy 
      </Button> 
     </StackPanel> 
     <TextBlock Name="Body" FontSize="14">Note Body</TextBlock> 
     </StackPanel> 
    </Grid> 
    </UserControl> 

Antwort

23

Ich habe Probleme mit Bildlaufleiste Sicht hatte, als eine StackPanel verwenden. Ich denke es ist, weil die StackPanel immer so groß ist, wie es sein muss, um alle seine Kinder zu enthalten. Versuchen Sie, das Layout zu reorganisieren, um die StackPanel zu entfernen (verwenden Sie stattdessen eine Grid) und sehen Sie, ob das hilft.

+0

Wenn ich Listbox in Grid statt StackPanel einsetzte, verschwand das Problem. Ich dies ein WPF-Code-Bug, WPF-Design-Bug oder absichtliche WPF-Verhalten ?? –

+0

Ich denke, es ist nur die Art, wie das StackPanel funktioniert. In Ihrem Fall war das StackPanel so groß wie die ListBox ohne Scrollen, dann wurde das StackPanel unten abgeschnitten. –

+0

Ja, das Problem ist mit StackPanel und das Problem wird von Grid gelöst. Danke @JohnMyczek –

2

Heya, ich vermute, Was passieren könnte, ist, dass Ihre ListBox genug für jedes Element erweitert, aber die ListBox verschwindet tatsächlich von der Unterseite der Enthalten Kontrolle.

Hat eigentlich die ListBox richtig zu stoppen oder ist es einfach zu verschwinden scheinen? Versuchen Sie, eine MaxHeight auf der ListBox zu setzen und zu sehen, ob dadurch die Bildlaufleiste erscheint. Sie sollten die VerticalScrollBarVisibility auf Auto setzen können, damit sie nur bei Bedarf angezeigt wird.

+0

Ich hätte erwähnen sollen, dass ich versucht habe, die Größe der Listbox genau so einzuschränken, wie Sie es vorschlagen. Das Ergebnis war keine Verbesserung. –

0

Eine andere Lösung für dieses Problem, die gut funktioniert, ist eine ScrollViewer um die StackPanel setzen.

2

Wenn das Listenfeld in einem Stackpanel ist, versuchen Sie diese Schritte für Ihre ListBox

  1. Set ScrollViewer.VerticalScrollBarVisibility = "Auto"
  2. die Height-Eigenschaft eines List-Box zu einer gewissen Höhe einstellen, die Sie erwarten sehen.

, dass die Bildlaufleiste zu zeigen zwingen sollte.

1

Das ist ziemlich spät, aber jeder ListBox wahrscheinlich verwenden, sollten sie nicht in einem Stackpanel haben. Sobald ich das übergeordnete Steuerelement meiner Listbox von StackPanel zu DockPanel mit LastChildFill = True wechselte (wo die Listbox das letzte Steuerelement war), funktionierte meine Bildlaufleiste perfekt.

Hoffe das hilft jemandem, der Problem wurde nicht durch die obige Antwort gelöst.

0

Eine andere Lösung mit einer Modifikation von Dave ist, nur den ScrollViewer zu verwenden. Sie können nur scrollen, indem Sie Ihre Maus auf die ScrollBar der ScrollView setzen. Ich benutze es so, weil ich nicht mag, wie ListBox von Element zu Element springt und manchmal Elemente von Oben fehlt. Ein bisschen hart für die Augen auch. Ich mag ScrollViewer's reibungsloses Scrollen.

+0

Lesen Sie diesen Beitrag, um einen Bildlauf hinzuzufügen, wenn sich die Maus über der ListBox befindet. http://stackoverflow.com/questions/2976240/how-can-make-scrollviewer-scroll-when-mouse-is-over-any-content?rq=1 – VcDeveloper

4

Sie müssen nur Height Eigenschaft einzuführen, wie folgt aus:

<ListBox Height="200" 
     Name="NoteList" 
     ScrollViewer.CanContentScroll="True" 
     ScrollViewer.VerticalScrollBarVisibility="Visible"> 
</ListBox>