2009-08-21 10 views
21

Czy ktoś może mi pomóc, aby włączyć przewijanie widoku drzewa? Musi istnieć prosty sposób, ale nie mogę sprawić, by działał w moim kodzie. Po wielokrotnym udało prób, Obecnie mam coś takiego:Włącz przewijanie dla widoku drzewa WPF

 <ScrollViewer CanContentScroll="True"> 
      <TreeView ...> 
      </TreeView> 
     </ScrollViewer> 

widzę za „niepełnosprawnego” pasek przewijania, ale kiedy nuty katalogów są większe niż wysokość ekranu, przewijanie nie jest aktywna.

Odpowiedz

34

Samo formant TreeView zawiera w swoim szablonie ScrollViewer. Powinieneś móc po prostu użyć TreeView wewnątrz odpowiedniego hosta (nie StackPanel!).

+3

Czym dokładnie jest odpowiedni host? My TreeView DOES leży jednak wewnątrz StackPanel. – Ronald

+0

Myślę, że mówi on o tym, że ScrollViewer nie jest odpowiednim hostem, tak jak "Nie jest StackPanelem!" część, naprawdę nie rozumiem, nie powinno być żadnej różnicy w zachowaniu TreeView, jeśli używasz go w Grid, StackPanel, WrapPanel, UniformGrid, itp. – Carlo

+23

'StackPanel' podaje swoją treść niezależnie od szerokości (kiedy orientacja jest pozioma) lub wysokości (gdy orientacja jest pionowa), której dzieci proszą. Tak więc, jeśli umieścisz 'TreeView' (lub' ListBox' w czymkolwiek) w 'StackPanel', to' TreeView' pomyśli, że ma wystarczającą wysokość, aby wyświetlić wszystkie elementy bez potrzeby użycia 'ScrollBar'. W rzeczywistości "TreeView" zostanie odcięty, ponieważ skończy Ci się ekran nieruchomości. Zamiast tego użyj 'Grid'. –

2

Czy masz wysokość wyraźnie ustawioną w oknie? Jeśli chcesz zobaczyć pasek przewijania coś musi zdefiniować wysokość TreeView lub jego kontenera, w przeciwnym razie nie będzie wiedział, kiedy trzeba wyświetlić pasek przewijania.

przykład:

<Window x:Class="StackOverflowTests.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" x:Name="window1" Height="300" Width="300"> 
    <Grid> 
     <TreeView Name="treeView1" Height="150" VerticalAlignment="Top"> 
      <TreeViewItem Header="Root" IsExpanded="True"> 
       <TreeViewItem Header="Item 1"></TreeViewItem> 
       <TreeViewItem Header="Item 2"></TreeViewItem> 
       <TreeViewItem Header="Item 3"></TreeViewItem> 
       <TreeViewItem Header="Item 4"></TreeViewItem> 
       <TreeViewItem Header="Item 5"></TreeViewItem> 
       <TreeViewItem Header="Item 6"></TreeViewItem> 
       <TreeViewItem Header="Item 7"></TreeViewItem> 
       <TreeViewItem Header="Item 8"></TreeViewItem> 
       <TreeViewItem Header="Item 9"></TreeViewItem> 
       <TreeViewItem Header="Item 10"></TreeViewItem> 
       <TreeViewItem Header="Item 11"></TreeViewItem> 
       <TreeViewItem Header="Item 12"></TreeViewItem> 
       <TreeViewItem Header="Item 13"></TreeViewItem> 
       <TreeViewItem Header="Item 14"></TreeViewItem> 
       <TreeViewItem Header="Item 15"></TreeViewItem> 
       <TreeViewItem Header="Item 16"></TreeViewItem> 
       <TreeViewItem Header="Item 17"></TreeViewItem> 
       <TreeViewItem Header="Item 18"></TreeViewItem> 
       <TreeViewItem Header="Item 19"></TreeViewItem> 
       <TreeViewItem Header="Item 20"></TreeViewItem> 
       <TreeViewItem Header="Item 21"></TreeViewItem> 
       <TreeViewItem Header="Item 22"></TreeViewItem> 
       <TreeViewItem Header="Item 23"></TreeViewItem> 
       <TreeViewItem Header="Item 24"></TreeViewItem> 
       <TreeViewItem Header="Item 24"></TreeViewItem> 
      </TreeViewItem> 
     </TreeView> 
    </Grid> 
</Window> 
+0

Niestety, próbowałem dodać wysokości do widoku drzewa i jego kontenera, ale bez powodzenia – Ronald

+0

Hmmm dostałem pasek przewijania, dodam mój przykład do mojej odpowiedzi, zobacz, czy to działa, w zasadzie wysokość okna jest ustawiona na 300 i Wysokość widoku drzewa wynosi 150, więc widok drzewa jest o połowę wyższy od okna i otrzymuje pasek przewijania, jeśli jego elementy przepełniają wysokość. – Carlo

+0

Dodałem wysokość do siatki i zadziałało. –

6

TreeView zawiera ScrollViewer, ale @Carlo powiedział TreeView lub opakowanie musi mieć wysokość. Alternatywnie TreeView powinien być hostowany w kontenerze, który nie daje nieskończonej wysokości swoim elementom podrzędnym (tj. StackPanel, który moim zdaniem miał znaczenie). Więc umieść go w siatce, nie trzeba podawać siatki ani widoku TreeView na wyraźną wysokość i powinieneś dostać paski przewijania.

0

Zamiast widoku drzewa można użyć Expander. Który może skaleczyć się przy przewijaniu, przeglądać poprawnie tę pracę tak samo jak widok drzewa.

0

Jest to po prostu kwestia przyznania TreeView stałej wysokości i szerokości. I może umieścić go w granicy. Mam też MaxWidth na zawartość moich produktów. Na przykład poniższe nie jest moim głównym oknie ramach dwóch paneli stosu i to działa (używam kontrole MahApps metro):

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
     <Border BorderThickness="2" BorderBrush="DarkGoldenrod" Margin="4"> 
     <TreeView x:Name="TreeView" Width="400" Height="800" Focusable="True" VerticalAlignment="Top"> 
     </TreeView>    
    </Border> 
</StackPanel> 
0

Jak tylko o ustawienie wysokości i szerokości do określonej kwoty? Wiem, że to może nie być odpowiedź dla wszystkich.

+1

O ile mi wiadomo, to w ogóle * nie odpowiada na pytanie *. Wysokość i szerokość * co * powinna być ustalona? I w jaki sposób włącza paski przewijania? –

+0

Przeczytaj ponownie pytanie. "Widzę" wyłączony "pasek przewijania, ale gdy nuty widoku drzewa są większe niż wysokość ekranu, żadne przewijanie nie jest aktywne." ustawienie wysokości i szerokości w widoku drzewa. Jest to rzeczywiście wspomniane w poście powyżej mojej. Jeśli dobrze pamiętam, po ustawieniu wysokości i szerokości w widoku drzewa paski przewijania są wyświetlane po zmianie rozmiaru okna głównego. –

Powiązane problemy