WPF ScrollViewer为我的listview(在网格行中)提供了整个屏幕,而不是一部分

WPF ScrollViewer为我的listview(在网格行中)提供了整个屏幕,而不是一部分,wpf,xaml,scrollviewer,Wpf,Xaml,Scrollviewer,我的usercontrol上的主网格有3行。顶行是一个数据绑定的listvew,占整个窗口的60%(数据行比可以显示的多,listview自动显示一个滚动条-这很好)。第二行是gridsplitter,第三行占据了显示的其余部分 这第三行有一个用边框包裹的网格,还包含一个包装的文本框,可以变大。当它这样做时,它有时会按下屏幕底部的按钮,所以我想,如果我在主网格上包装一个ScrollViewer,我会保持屏幕上的3行与现有listview滚动条保持相同的比例不变,然后在右侧增加一个滚动条,如果第3

我的usercontrol上的主网格有3行。顶行是一个数据绑定的listvew,占整个窗口的60%(数据行比可以显示的多,listview自动显示一个滚动条-这很好)。第二行是gridsplitter,第三行占据了显示的其余部分

这第三行有一个用边框包裹的网格,还包含一个包装的文本框,可以变大。当它这样做时,它有时会按下屏幕底部的按钮,所以我想,如果我在主网格上包装一个ScrollViewer,我会保持屏幕上的3行与现有listview滚动条保持相同的比例不变,然后在右侧增加一个滚动条,如果第3行太高,我可以向下滚动查看按钮(就像您在这个带有滚动条的浏览器页面上所做的那样,代码和页面滚动条也是如此

相反,listview的第一行已经垂直展开,占据了整个屏幕,在滚动到listview中所有项目的末尾之前,我根本看不到第2行或第3行。我尝试了各种硬编码行高的组合(糟糕,我知道)'Auto'&'*'现在有用了

有什么方法可以完成我正在尝试的吗?我不认为我必须(也不想)为此重新设计整个屏幕

谢谢,我是WPF的新手&这很有趣,但有时也很令人沮丧

我在下面发布了一些XAML,但我不确定它是否有用

 <ScrollViewer>
    <Grid Name="grdEvents" HorizontalAlignment="Center" >
    <Grid.RowDefinitions>
        <RowDefinition Height="60*" />
        <RowDefinition Height="10" />
        <RowDefinition Height="30*"/>
    </Grid.RowDefinitions>
    <ListView SelectionChanged="lvActivities_SelectionChanged" MouseDoubleClick="ListView_MouseDoubleClick" Grid.Row="0" Name="lvActivities" HorizontalAlignment="Stretch" LVLO:ListViewLayoutManager.Enabled="True" >
        <!--ItemContainerStyle="{StaticResource SelectedItem}"   MouseEnter="lvActivities_MouseEnter"  -->

        <ListView.ItemContainerStyle>
            <Style TargetType="ListBoxItem">


在行上使用硬编码高度,而不是使用比例。将第一行的60*更改为60

此外,为了进行试验,您可以尝试以下方法:

<Grid.RowDefinitions>
    <RowDefinition Height="2*"/>
    <RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ListBox Name="ListBox1" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100" Grid.Row="0" Background="Blue"/>
<ScrollViewer Grid.Row="1">
    <StackPanel >   
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click" />
        <TextBox>Hello </TextBox>
    </StackPanel>
</ScrollViewer>

你好
它只在第二行添加了一个滚动查看器,然后您可以使用堆栈面板来存储其余的元素,这也让它看起来更好一些


例如,刚刚添加了元素;用您自己的元素替换它们。

我不认为使用相对行大小可以实现您想要的。但是,您可以做的是,在ScrollViewer的大小发生变化时,手动将顶部行的高度按比例设置。但是,由于您也有一个拆分器,因此您希望停止执行此操作用户手动调整高度。请看以下内容:

XAML:


请注意,当用户双击拆分器时,我选择恢复默认大小和自动大小管理。这不是最漂亮的解决方案,但它优于使用固定高度。请随意将行为封装在自定义面板/控件中。

与其在行上设置高度,不如在listview上尝试设置它。同样,请注意他*使它成为视图的倍数/部分。如果您希望它是静态的(这样它就不会一直展开)然后做60而不是60*。而不是用
30*
尝试
Auto
。谢谢@Tauginchts,你的第二个建议奏效了,但我试图避免硬编码高度。我不明白,虽然成比例的方法不起作用(我发誓我在发布这篇文章之前就试过了——哦,好吧。顺便说一句,我不知道如何让你的评论成为答案,但如果你以我能做到的方式发布,我会回来的。我将它作为答案发布。非常欢迎你。)
<Grid.RowDefinitions>
    <RowDefinition Height="2*"/>
    <RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ListBox Name="ListBox1" HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="100" Grid.Row="0" Background="Blue"/>
<ScrollViewer Grid.Row="1">
    <StackPanel >   
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click" />
        <TextBox>Hello </TextBox>
    </StackPanel>
</ScrollViewer>
<Window x:Class="StackOverflow.Wpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>
    <ScrollViewer x:Name="_scrollViewer">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition x:Name="_mainRow" />
          <RowDefinition Height="Auto" />
          <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <ListView />

        <GridSplitter x:Name="_splitter"
                      Grid.Row="1"
                      Height="5"
                      HorizontalAlignment="Stretch"
                      ResizeDirection="Rows"
                      ResizeBehavior="PreviousAndNext"
                      MouseDoubleClick="OnSplitterMouseDoubleClick" />

        <Grid Grid.Row="2" />
      </Grid>
    </ScrollViewer>
  </Grid>
</Window>