c# - ScrollViewer 中的 WPF DataGrid
问题描述
我有一个StackPanel
带有标题控件和一个DataGrid
Inside a Scrollviewer
; 像这样:
<ScrollViewer>
<StackPanel Orientation="Vertical">
<Canvas x:Name="header"
Height="300" />
<DataGrid x:Name="dataGrid">
</DataGrid>
</StackPanel>
</ScrollViewer>
scoll 行为应满足以下要求:
- MouseOver 时滚动
DataGrid
应该滚动外部ScrollViewer
标题控件(由 表示
Canvas
)由 滚动ScollViewer
。底部的水平滚动条
DataGrid
应随时保留在屏幕上。水平滚动条不应该滚动标题控件,只有
DataGrid
.
我尝试了各种设置,DataGrid.ScrollViewer
但都没有达到预期的效果,更改StackPanel
为 aWrapPanel
甚至Grid
没有任何帮助。
这可能吗?感谢您提供任何帮助和阅读资源。
解决方案
我也一直在努力解决您的第一个问题 - 让内部 ScrollViewer(或本例中的 DataGrid)滚动外部 ScrollViewer。但我认为我有一个非常优雅的解决方案。您必须将事件处理程序添加到 DataGrid 的 PreviewMouseWheel 事件(以及 ScrollViewer 的名称):
<ScrollViewer x:Name="scroll_viewer">
<StackPanel Orientation="Vertical">
<Canvas x:Name="header"
Height="300" />
<DataGrid x:Name="dataGrid" PreviewMouseWheel="mousewheel">
</DataGrid>
</StackPanel>
</ScrollViewer>
然后是事件处理方法:
private void mousewheel(object sender, MouseWheelEventArgs e)
{
//what we're doing here, is that we're invoking the "MouseWheel" event of the parent ScrollViewer.
//first, we make the object with the event arguments (using the values from the current event)
var args = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
//then we need to set the event that we're invoking.
//the ScrollViewer control internally does the scrolling on MouseWheelEvent, so that's what we're going to use:
args.RoutedEvent = ScrollViewer.MouseWheelEvent;
//and finally, we raise the event on the parent ScrollViewer.
scroll_viewer.RaiseEvent(args);
}
希望这可以帮助!
推荐阅读
- sql - 在 SQL 中将多个列一起旋转
- java - 聚合后缺少最后一组
- javascript - 如何在没有按钮的情况下在本地存储中保存两个复选框之一
- c# - 如何在 ASP.NET CORE 2.2 中将变量从表单传递到 ajax
- mongodb - 如何从 MongoDB 集合中的文档中提取前 n 个元素?
- python - Python2中的非阻塞“等待按键”功能
- azure - 通过 Kubernetes 挂载卷时 Neo4j 关闭
- docker - 用于离线镜像的 Docker DCT
- cakephp - 如何保存重复记录使用belongsToMany?
- javascript - Service Worker 只显示第一个推送通知(来自云消息传递),直到我重新加载 - 消息已被工作人员收到