WPF ScrollViewer为我的listview(在网格行中)提供了整个屏幕,而不是一部分
我的usercontrol上的主网格有3行。顶行是一个数据绑定的listvew,占整个窗口的60%(数据行比可以显示的多,listview自动显示一个滚动条-这很好)。第二行是gridsplitter,第三行占据了显示的其余部分 这第三行有一个用边框包裹的网格,还包含一个包装的文本框,可以变大。当它这样做时,它有时会按下屏幕底部的按钮,所以我想,如果我在主网格上包装一个ScrollViewer,我会保持屏幕上的3行与现有listview滚动条保持相同的比例不变,然后在右侧增加一个滚动条,如果第3行太高,我可以向下滚动查看按钮(就像您在这个带有滚动条的浏览器页面上所做的那样,代码和页面滚动条也是如此 相反,listview的第一行已经垂直展开,占据了整个屏幕,在滚动到listview中所有项目的末尾之前,我根本看不到第2行或第3行。我尝试了各种硬编码行高的组合(糟糕,我知道)'Auto'&'*'现在有用了 有什么方法可以完成我正在尝试的吗?我不认为我必须(也不想)为此重新设计整个屏幕 谢谢,我是WPF的新手&这很有趣,但有时也很令人沮丧 我在下面发布了一些XAML,但我不确定它是否有用WPF ScrollViewer为我的listview(在网格行中)提供了整个屏幕,而不是一部分,wpf,xaml,scrollviewer,Wpf,Xaml,Scrollviewer,我的usercontrol上的主网格有3行。顶行是一个数据绑定的listvew,占整个窗口的60%(数据行比可以显示的多,listview自动显示一个滚动条-这很好)。第二行是gridsplitter,第三行占据了显示的其余部分 这第三行有一个用边框包裹的网格,还包含一个包装的文本框,可以变大。当它这样做时,它有时会按下屏幕底部的按钮,所以我想,如果我在主网格上包装一个ScrollViewer,我会保持屏幕上的3行与现有listview滚动条保持相同的比例不变,然后在右侧增加一个滚动条,如果第3
<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>