什么是在 Wpf 中实现 ScrollViewer 的动态方式

Whats a dynamic way implementing a ScrollViewer in Wpf

如果 ScrollViewer 不是 window 中的唯一元素,我无法使其正常工作。我想滚动项目列表(列表设置为 ItemsSource),但也希望其他元素在我的 window 中可见。现在我不知道如何设置 height 相对于其他元素。这甚至是一种有效的方法还是我完全错了?

<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>

我搜索了将近三个小时,但我能找到的唯一解决方案是将滚动查看器设置为顶部元素。

它不适用于 StackPanel。 StackPanel 基于内容增长。实际上它可以与堆栈面板一起使用,但您需要定义 ScrollViewer 的高度。使用带有行定义的网格。

   <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>