2016-06-02 4 views
0

Я пытаюсь построить окно имеет три элемента управления списком данных с неопределенной длиной. Я хочу, чтобы все три были в пределах одного прокрутки.WPF несколько списков в одном scrollviewer

Проще говоря, следующий код: как я хочу, чтобы он работал. Конечно, результатом примера кода xaml является то, что содержимое scrollviewer выходит за пределы окна и не прокручивается.

Я попытался использовать управление сеткой, но это не сработало, как надеялось. Я не хочу иметь фиксированные высоты и отдельные полосы прокрутки для каждого из списков, так как могут быть переменные объемы данных, и это приведет к ненужной прокрутке.

Может ли кто-нибудь предоставить способ отображения нескольких списков переменных содержимого в пределах одной полосы прокрутки?

<Window x:Class="AmultiListTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:SomeNamespace" 
    mc:Ignorable="d" 
    Title="AmultiListTest" 
    Height="300" 
    Width="300"> 
<StackPanel> 
    <ScrollViewer> 
     <StackPanel Height="250"> 
      <Label>List number one</Label> 
      <ListView> 
       <ListViewItem>list 1 Item 1</ListViewItem> 
       <ListViewItem>list 1 Item 2</ListViewItem> 
       <ListViewItem>list 1 Item 3</ListViewItem> 
       <ListViewItem>list 1 Item 4</ListViewItem> 
       <ListViewItem>list 1 Item 5</ListViewItem> 
       <ListViewItem>list 1 Item 6</ListViewItem> 
       <ListViewItem>list 1 Item 7</ListViewItem> 
       <ListViewItem>list 1 Item 8</ListViewItem> 
       <ListViewItem>list 1 Item 9</ListViewItem> 
      </ListView> 
      <Label>List number two</Label> 
      <ListView> 
       <ListViewItem>list 2 Item 1</ListViewItem> 
       <ListViewItem>list 2 Item 2</ListViewItem> 
       <ListViewItem>list 2 Item 3</ListViewItem> 
       <ListViewItem>list 2 Item 4</ListViewItem> 
       <ListViewItem>list 2 Item 5</ListViewItem> 
       <ListViewItem>list 2 Item 6</ListViewItem> 
      </ListView> 
      <Label>List number three</Label> 
      <ListView> 
       <ListViewItem>list 3 Item 1</ListViewItem> 
       <ListViewItem>list 3 Item 2</ListViewItem> 
       <ListViewItem>list 3 Item 3</ListViewItem> 
       <ListViewItem>list 3 Item 4</ListViewItem> 
      </ListView> 
     </StackPanel> 
    </ScrollViewer> 
</StackPanel> 

+3

Только от верхней части моей головы, я предлагаю вам попробовать удаление фиксированной высоты 250 из внутренней StackPanel и изменение внешней StackPanel на сетку. Сетка будет соответствовать размеру ее родителя (в этом случае Окно). Это заставит содержимое Grid (ScrollViewer) соответствовать размеру сетки, что приведет к прокручиванию поведения ScrollViewer. Если это не сработает, по крайней мере, вы не потратите много времени на это. –

+0

И удалите внешний StackPanel - вы даете ему бесконечную высоту. Используйте сетку. – Paparazzi

ответ

2

Прежде всего удалить высоту панели стека:

<StackPanel Height="250"> 

к

<StackPanel> 

Затем связать высоту свитка

(...) 
<ScrollViewer Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualHeight}"> 
    (...) 
</ScrollViewer> 

How can I get ScrollViewer to work inside a StackPanel?

+1

Нет необходимости связывать высоту ScrollViewer. Как сказано в комментариях к вопросу, замените внешний StackPanel на Grid. Как правило, никогда не связывайте Width или Height, когда вы можете просто использовать обычный макет. – Clemens

+0

Это решение - или переход на сетку для внешнего управления, обе работают. Однако, когда я пытаюсь добавить заголовок (который не будет прокручиваться), я сталкиваюсь с проблемой, когда он перезаписывается (если сетка) или относительное значение высоты слишком велико.Есть ли способ, которым я могу вычесть высоту моего заголовка из привязки относительной высоты выше? – Scott

0

Выполнено решение для расчета высоты прокрутки. Я нашел способ включить заголовок, добавив код, чтобы уменьшить высоту scrollviewer по высоте панели стека заголовков. Вот XAML:

<Window x:Class="AmultiListTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:SomeNamespace" 
    mc:Ignorable="d" 
    Title="AmultiListTest" 
    Height="300" 
    Width="300" 
    Loaded="Window_Loaded"> 
<StackPanel> 
    <StackPanel x:Name="SPheader"> 
     <Label>this is header one</Label> 
     <Label>this is header two</Label> 
     <Separator /> 
    </StackPanel > 
    <ScrollViewer x:Name="SViewer" 
        Height="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Border}, Mode=FindAncestor}}"> 
     <StackPanel> 
      <Label Content="List number one" /> 
      <ListView> 
       <ListViewItem Content="list 1 Item 1" /> 
       <ListViewItem Content="list 1 Item 2" /> 
       <ListViewItem Content="list 1 Item 3" /> 
       <ListViewItem Content="list 1 Item 4" /> 
       <ListViewItem Content="list 1 Item 5" /> 
       <ListViewItem Content="list 1 Item 6" /> 
       <ListViewItem Content="list 1 Item 7" /> 
       <ListViewItem Content="list 1 Item 8" /> 
       <ListViewItem Content="list 1 Item 9" /> 

      </ListView> 
      <Label Content="List number two" /> 
      <ListView> 
       <ListViewItem Content="list 2 Item 1" /> 
       <ListViewItem Content="list 2 Item 2" /> 
       <ListViewItem Content="list 2 Item 3" /> 
       <ListViewItem Content="list 2 Item 4" /> 
       <ListViewItem Content="list 2 Item 5" /> 
       <ListViewItem Content="list 2 Item 6" /> 

      </ListView> 
      <Label Content="List number three" /> 
      <ListView> 
       <ListViewItem Content="list 3 Item 1" /> 
       <ListViewItem Content="list 3 Item 2" /> 
       <ListViewItem Content="list 3 Item 3" /> 
       <ListViewItem Content="list 3 Item 4" /> 
      </ListView> 
     </StackPanel> 
    </ScrollViewer> 

</StackPanel> 

И в окнах загружен код позади меня есть следующие строки ...

Public Class AmultiListTest 
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) 
    SViewer.Height = SViewer.Height - SPheader.ActualHeight 
End Sub 
End Class 

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


EDIT: Правильное решение - без привязки высоты ScrollViewer или установив его в коде - будет выглядеть следующим образом:

<Window ... /> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <StackPanel x:Name="SPheader" Grid.Row="0"> 
      ... 
     </StackPanel > 
     <ScrollViewer x:Name="SViewer" Grid.Row="1"> 
      ... 
     </ScrollViewer> 
    </Grid> 
</Window> 
+1

Ваш код заменяет привязку высоты, поэтому вы также можете удалить привязку со своего XAML. Кроме того, все, что привязывает или кодирует вещи, полностью избыточно. Вместо этого вы должны использовать стандартный механизм компоновки WPF. Например. замените внешнюю StackPanel сеткой двумя строками (и установите высоту первой строки в Auto). См. Мое редактирование. – Clemens

+0

Спасибо за комментарий к сетке. Я относительно новичок в WPF и ценю вход и пример. Окна, над которыми я работаю, намного сложнее с участием нескольких разделов и управления wazoo. Множество динамических элементов построено «на лету» на основе пользовательского ввода, поэтому стековые панели упростили работу. Я сделаю больше исследований по использованию Grid. – Scott

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