Search code examples
c#wpfscrollvieweritemscontrol

Whats a dynamic way implementing a ScrollViewer in Wpf


I am having trouble getting a ScrollViewer to work properly if it's not the only element in the window. I want to scroll through a list of items(a list set as ItemsSource) but also want other elements to be visible in my window. Now i don't know how to set the height relative to the other elements. Is that even a valid approach or am i doing it completly wrong?

<Window x:Class="FactorioWpf.MainWindow"
    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:FactorioWpf"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525" 
    Closing="Window_Closing">

<StackPanel>

    <Menu>
        <MenuItem Header="Items">
            <MenuItem Header="Add" Click="ItemsAdd_Click" />
        </MenuItem>
    </Menu>

    <Grid>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <ScrollViewer Grid.Column="0">
            <ItemsControl Name="ItemViewerItemsControl">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>

    </Grid>
</StackPanel>

I searched for nearly three hours but the only solutions i could find, were to set the scroll viewer as the top element.


Solution

  • It is not gonna work with StackPanel. StackPanel grows based on content. Actually it will work with stack panel but you need to define height of ScrollViewer. Use grid with row definitions.

       <Window x:Class="WpfApplication3.MainWindow"
                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:WpfApplication3"
                mc:Ignorable="d" Height="350" Width="525"  >
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
    
                <Menu Grid.Row="0">
                    <MenuItem Header="Items">
                        <MenuItem Header="Add" Click="MenuItem_OnClick" />
                    </MenuItem>
                </Menu>
    
                <Grid Grid.Row="1">
    
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Column="0">
                        <ItemsControl  Name="ItemViewerItemsControl">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                        <TextBlock Text="{Binding Name}" />
                                    </StackPanel>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </ScrollViewer>
                </Grid>
            </Grid>
        </Window>