底图实现

  • 需求功能
    • 思路
    • 前端

需求功能

1.在整个大界面下区别出一块绘制出运行图底图
2.有滚动条可以拖拽
3.可以实现放缩

思路

宽度:每天是1440min,设置2880个像素宽度,再留出60min(120像素点)作为跨日调整的需要
,再留出100个像素点作为边框。
高度:想想

前端

<Grid.ColumnDefinitions>

</Grid.ColumnDefinitions>

    <Slider Grid.Column="0" Orientation="Vertical" HorizontalAlignment="Left" Minimum="1" Value="5" x:Name="slider"/><!--提供五倍放缩--><TextBlock Text= "{Binding ElementName=slider,Path=Value}" Grid.Column="2" Height="20" VerticalAlignment="Top"/><ScrollViewer Name="scrollViewer" Grid.Column="1"  VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible"><Grid Name="grid" Width="3100"  Height="800"  RenderTransformOrigin="0.5,0.5"><Grid.LayoutTransform><TransformGroup><ScaleTransform x:Name="scaleTransform"/></TransformGroup></Grid.LayoutTransform><Line X1="10" Y1="20" X2="500" Y2="10" Stroke="Black" StrokeThickness="2"></Line><!--<Canvas Grid.Column="0" Grid.Row="0"><Line X1="20" Y1="600" X2="500" Y2="10" Stroke="Black" StrokeThickness="4"></Line></Canvas>--><!--<Viewbox Grid.Column="0" Grid.Row="0"><ContentPresenter Content="I Don't know how"/></Viewbox>--></Grid></ScrollViewer>
</Grid>

## 后端

`

namespace DrawLine
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
Point? lastCenterPositionOnTarget;//定义了三个坐标变量
Point? lastMousePositionOnTarget;
Point? lastDragPoint;//最后拉拽点

    public MainWindow(){InitializeComponent();scrollViewer.ScrollChanged += OnScrollViewerScrollChanged;//拉条条scrollViewer.MouseLeftButtonUp += OnMouseLeftButtonUp;//preview是隧道,向下scrollViewer.PreviewMouseLeftButtonUp += OnMouseLeftButtonUp;//路由和冒泡事件都关联,就是释放一些东西scrollViewer.PreviewMouseWheel += OnPreviewMouseWheel;//滚轮改变那个条条的值,只在scrollviewer中才有用scrollViewer.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;scrollViewer.MouseMove += OnMouseMove;//实现拖拽slider.ValueChanged += OnSliderValueChanged;//最关键的,比例尺的变化}void OnMouseMove(object sender, MouseEventArgs e){if (lastDragPoint.HasValue)//在DOWN里有值,一UP就会没值,通过这个有没有值来实现拖拽{Point posNow = e.GetPosition(scrollViewer);//获得在scrollviewer中的位置?double dX = posNow.X - lastDragPoint.Value.X;double dY = posNow.Y - lastDragPoint.Value.Y;lastDragPoint = posNow;scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset - dX);scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - dY);}}void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e){var mousePos = e.GetPosition(scrollViewer);//在scrollviewer中的位置if (mousePos.X <= scrollViewer.ViewportWidth && mousePos.Y <scrollViewer.ViewportHeight) //make sure we still can use the scrollbars{scrollViewer.Cursor = Cursors.SizeAll;lastDragPoint = mousePos;Mouse.Capture(scrollViewer);//鼠标被这个框框捕获,不这个的话就失效了}}void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e){lastMousePositionOnTarget = Mouse.GetPosition(grid);//获得grid中的位置?if (e.Delta > 0)//鼠标滚轮的改变,向前是正,向自己是负数{slider.Value += 1;}if (e.Delta < 0){slider.Value -= 1;}e.Handled = true;//表示该操作以及处理过了。e.Handled = true;来终止传递(和隧道与冒泡事件有关)}void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e){scrollViewer.Cursor = Cursors.Arrow;//松了之后变回箭头scrollViewer.ReleaseMouseCapture();//释放lastDragPoint = null;//也算是释放}void OnSliderValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e){scaleTransform.ScaleX = e.NewValue;scaleTransform.ScaleY = e.NewValue;var centerOfViewport = new Point(scrollViewer.ViewportWidth / 2,scrollViewer.ViewportHeight / 2);lastCenterPositionOnTarget = scrollViewer.TranslatePoint(centerOfViewport, grid);}void OnScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e){if (e.ExtentHeightChange != 0 || e.ExtentWidthChange != 0){Point? targetBefore = null;Point? targetNow = null;if (!lastMousePositionOnTarget.HasValue){if (lastCenterPositionOnTarget.HasValue){var centerOfViewport = new Point(scrollViewer.ViewportWidth / 2,scrollViewer.ViewportHeight / 2);Point centerOfTargetNow =scrollViewer.TranslatePoint(centerOfViewport, grid);targetBefore = lastCenterPositionOnTarget;targetNow = centerOfTargetNow;}}else{targetBefore = lastMousePositionOnTarget;targetNow = Mouse.GetPosition(grid);lastMousePositionOnTarget = null;}if (targetBefore.HasValue){double dXInTargetPixels = targetNow.Value.X - targetBefore.Value.X;double dYInTargetPixels = targetNow.Value.Y - targetBefore.Value.Y;double multiplicatorX = e.ExtentWidth / grid.Width;double multiplicatorY = e.ExtentHeight / grid.Height;double newOffsetX = scrollViewer.HorizontalOffset -dXInTargetPixels * multiplicatorX;double newOffsetY = scrollViewer.VerticalOffset -dYInTargetPixels * multiplicatorY;if (double.IsNaN(newOffsetX) || double.IsNaN(newOffsetY)){return;}scrollViewer.ScrollToHorizontalOffset(newOffsetX);scrollViewer.ScrollToVerticalOffset(newOffsetY);}}}
}

}
`

WPF列车运行图绘制功能相关推荐

  1. 基于matlab的列车运行图绘制

    部分代码展示 因为涉及到站点,可以参考代码写作 运行图绘制的方法 for i=1:n flagi(i)=0;% ±ê¼Çµ½´ïʱ¿Ì c(i)=1;%³ö¿âÁгµ±ê¼Ç end for j= ...

  2. 列车运行图编制系统/列车运行图绘制系统(C#)

    因为疫情回不去实验室,所以也没办法连上本地数据库具体把运行线画出来了.(找到了原来拍给朋友看的视频,截图两张,因为是大铁的数据,看着会密密麻麻的倒数第二张,不过可以放大啦,倒数第一张) 分析一项功能把 ...

  3. C# 列车运行图绘制与编排

    最近接触到列车运行图,并动手做了一下小的程序,实现了列车运行图的绘制.编排.重绘.查询.修改时刻表.系统日志.截图等功能. dashang 100,(点赞,收藏+关注)截图私聊发码源(感谢大家的支持) ...

  4. WPF使用Canvas绘制可变矩形

    WPF使用Canvas绘制可变矩形 原文:WPF使用Canvas绘制可变矩形 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/WANGYAN9110/ ...

  5. AFC中央计算机系统图,浅谈AFC系统在列车运行图中的运用

    摘要:介绍了列车运行图的传统编制方法.AFC自动售检票系统的基本情况以及应用后给运行图编制过程带来的变化. 关键词:地铁:列车运行图:自动售检票系统:最大断面客流量 随着改革开放的深入发展和城市化进程 ...

  6. 基于Python语言和PyQt5的铁路列车运行图系统

    概述 本项目是基于Python语言和PyQt5的非官方性质.简易的中国铁路列车运行图系统.本代码的发布遵循GPLv3协议.在协议允许范围内,作者保留一切权利和最终解释权. 与ETRC的联系 渊源 py ...

  7. 计算机编制列车运行图实验分析,计算机编制列车运行图实验大纲

    <计算机编制列车运行图实验大纲>由会员分享,可在线阅读,更多相关<计算机编制列车运行图实验大纲(4页珍藏版)>请在人人文库网上搜索. 1.计算机编制列车运行图实验大纲课程名称: ...

  8. Visio绘制功能分解图

    为什么要绘制功能分解图? 对于编程人员来说,具体分配任务的时候,必须知道自己要做什么,必须了解系统的大体框架.功能分解图可以帮助我们理清程序的框架,便于大局观的掌握. 用Visio2010创建功能分解 ...

  9. OpenCV 中的绘制功能

    本文主要内容来自于 OpenCV-Python 教程 的 OpenCV 中的 GUI 功能 部分,这个部分的主要内容如下: 图像操作入门 学习加载一幅图像,显示它,并保存它 视频入门 学习播放视频,从 ...

最新文章

  1. Java锁的种类以及辨析(二):自旋锁的其他种类
  2. 搭建前端vue环境,安装vue-cli遇到Please try running this command again as root/Administrator的解决方案...
  3. pg 10 wal 归档同步配置
  4. Kaggle问题总结1
  5. docker kubernetes--
  6. Ubuntu千万不要运行的命令
  7. 解决linux写入ntfs盘时报错:只读文件系统
  8. 文本分类(一)封装分词器
  9. android自动化(appium)
  10. cartographer探秘第四章之代码解析(四) --- 后端优化 --- 约束计算
  11. safari html5 自动全屏,IOS10全屏safari Javascript
  12. 中国电信物联网建设全面提速 投入三亿元补贴物联网模块
  13. Mybatis-Plus eq、ne、gt、lt、ge、le
  14. Excel数据行高参差不齐,如何一键设置固定行高
  15. 利用Matplotlib绘制莫比乌斯带
  16. 写博客,轻松拿大奖!博客征文第二期:那些年我们一起写过的代码
  17. 浅谈JMS--(JMS 的简介)
  18. CSS3弹性盒子之内容对齐justify-conten
  19. 数据清洗python实现箱线图_GitHub - nonefirst/data_analysis: 基于Python的南京二手房数据采集及可视化分析...
  20. 复活的鲁路修 [Mabors-Sub][Code Geass Fukkatsu no Lelouch][Movie][1080P][GB][BDrip][AVC AAC YUV420P8].mp4

热门文章

  1. 微型计算机snb评测,搭载英特尔SNB芯 联想B320一体机评测
  2. BootstrapTable Export导出xlsx格式
  3. H1标签有用吗?怎么使用呢
  4. 电脑中毒软件都变成java图标,电脑桌面图标变成黑色方块该怎么解决?
  5. 腾讯QQ玩一玩入口今日开放,小游戏再增巨量平台!
  6. 【RAC】将单实例备份集恢复为rac数据库
  7. Centos7 安装Docker(2020最新亲测可用,直接复制粘贴即可)
  8. HP Xeon 55xx上GPU的带宽问题
  9. 关于医院管理软件的感想(一)
  10. 访问ECS服务器的网站提示“由于你访问的URL可能对网站造成安全威胁,您的访问被阻断”