如何有人告诉你,请你画出1像素的线,是不是觉得很简单,实际上在 WPF 上还是比较难的。

本文告诉大家,如何让画出的线不模糊

画出线的第一个方法,创建一个 Canvas ,添加一个线

界面代码

            <Canvas x:Name="Canvas"></Canvas>

在后台添加一条线

            Line myLine = new Line();myLine.Stroke = System.Windows.Media.Brushes.Black;myLine.X1 = 100;myLine.X2 = 200;  // 150 too farmyLine.Y1 = 200;myLine.Y2 = 200;myLine.StrokeThickness = 1;Canvas.Children.Add(myLine);

那么如何看到线模糊呢?

简单方法是使用 ViewBox 和放大镜,可以看到模糊

在界面添加下面代码

    <Viewbox ><Canvas x:Name="Canvas"></Canvas></Viewbox>

这时拖动窗口可以看到线放大

可以看到线是模糊的,如果想要让线不模糊,可以添加下面的代码

        myLine.SnapsToDevicePixels = true;myLine.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);

这个方法是从 [https://stackoverflow.com/q/2879033/6116637][https://stackoverflow.com/q/2879033/6116637]得到,但是无法对于自己的控件

如果自己创建一个控件,那么直接使用 dc.DrawLine 得到不是清晰的

创建一个类自定义控件,添加下面的代码画出线

        protected override void OnRender(DrawingContext dc){dc.DrawLine(_pen,  new Point(10, 10), new Point(310, 10));}

可以看到,画出来的线是模糊的,于是看了微软的代码

看了他的矩形是如何画的,看到他画出来的是清晰的,但是复制他的代码到我的控件,画出来不是清晰的

        /// <summary>/// Render callback./// </summary>protected override void OnRender(DrawingContext drawingContext){Pen pen = GetPen();drawingContext.DrawRoundedRectangle(Fill, pen, _rect, RadiusX, RadiusY);}

下面代码是我复制他的,但是自己的控件画出来在放大时,线模糊,所以直接复制是无法做到wr的矩形那样

       protected override void OnRender(DrawingContext dc){dc.DrawRoundedRectangle(null, _pen, new Rect(new Point(10, 10), new Size(100, 100)), 5, 5);}

在界面画出来wr 的矩形和自定义控件,可以看到,微软的是清晰的

那么是不是wr 做了特殊的东西,到现在还不知道,但是找到了一个方法,可以画出清晰

缩小看到的图片是这样

那么放大时就是下面这张图

所以需要在放大时,也画一个像素,
这个方法就是本文,所以这是在翻译,只是没有使用对所有的文字翻译,来自工藤大神的方法。

本文使用的方法很简单,第一步

复制方法到一个静态类

    public static void DrawSnappedLinesBetweenPoints(this DrawingContext dc,Pen pen, double lineThickness, params Point[] points){var guidelineSet = new GuidelineSet();foreach (var point in points){guidelineSet.GuidelinesX.Add(point.X);guidelineSet.GuidelinesY.Add(point.Y);}var half = lineThickness / 2;points = points.Select(p => new Point(p.X + half, p.Y + half)).ToArray();dc.PushGuidelineSet(guidelineSet);for (var i = 0; i < points.Length - 1; i = i + 2){dc.DrawLine(pen, points[i], points[i + 1]);}dc.Pop();}

然后就可以在自定义控件使用下面的代码

      protected override void OnRender(DrawingContext dc){dc.DrawSnappedLinesBetweenPoints(_pen,1, new[]{new Point(10, 10),new Point(310, 10),});}

可以看到线是清晰的

参见:https://stackoverflow.com/a/45189552/6116637

http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

WPF 如何画出1像素的线相关推荐

  1. [css] 不使用border画出1px高的线,在不同浏览器的标准和怪异模式下都能保持效果一样

    [css] 不使用border画出1px高的线,在不同浏览器的标准和怪异模式下都能保持效果一样 <div style="width: 100%;height: 1px;"&g ...

  2. 画出优秀手绘线稿的必备条件,首先要满足和避免这些线条

    手绘线稿应该怎么画?如何画出线条流畅的线稿,这些绘画错误点首先是要避免的!本期,"美术集网校"小编就带大家一起了解画好手绘线稿需要做的工作吧: 首先线稿不论哪种绘制风格,所表现出来 ...

  3. python画k线图_一步一步教你用Python画出专业的K线图

    漂亮的界面是量化程序的脸面,直观专业的界面能帮助我们了解股票的走势和形象地展示量化交易的结果.本文介绍如何使用matplotlib做出专业的K线图和展示各种技术指标: matplotlib是受MATL ...

  4. 如何使用python画出好看的K线图

    tushare ID:468684 一.安装mplfinance库 画K线蜡烛图,使用python的mplfinance库比较方便 安装:pip install mplfinance mplfinan ...

  5. python绘制蜡烛图_一步一步教你用Python画出专业的K线图

    漂亮的界面是量化程序的脸面,直观专业的界面能帮助我们了解股票的走势和形象地展示量化交易的结果.本文介绍如何使用matplotlib做出专业的K线图和展示各种技术指标: matplotlib是受MATL ...

  6. 用python绘制股票图_一步一步教你用Python画出专业的K线图

    漂亮的界面是量化程序的脸面,直观专业的界面能帮助我们了解股票的走势和形象地展示量化交易的结果.本文介绍如何使用matplotlib做出专业的K线图和展示各种技术指标: matplotlib是受MATL ...

  7. 画出0.5px的线,css

    1,box-shadow box-shadow允许小数点,该属性可设置的值包括阴影的X轴偏移量.Y轴偏移量.模糊半径.扩散半径和颜色,所以我们可以设置他的扩散半径来实现0.5px的线 2,  tran ...

  8. 流程图中的实线_化工工艺流程图中的设备用细实线画出,主要物料流程线用粗实线画出。()_搜题易...

    阅读润滑油精制工段管道及仪表流程图并完成填空: (1)该工段共有设备_______________ 台,其中具有相同型号的设备有两种,一种设备是 _______________ ,该设备有______ ...

  9. Axure如何画出页面的线框图

    我们在设计产品的时候,就好比微信,由很多个可滑动的页面组成,而每个页面中存在的线框图也需要一个一个去进行设计.我们都知道 Axure(http://www.axurechina.cc/)是一款原型设计 ...

最新文章

  1. ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?
  2. vuejs出的手机app有哪些_详解Vue webapp项目通过HBulider打包原生APP
  3. 【STM32 .Net MF开发板学习-21】蓝牙遥控智能小车(PC模式)
  4. 前端学习(2398):回顾
  5. 探索比特币源码4-JSON-RPC接口的其他调用方法
  6. 配置文件keepalived.conf详解
  7. 红旗与火狐携手打造优质开源体验,推出红旗Linux专版火狐浏览器
  8. 百度下拉词框优化推广该如何利用及优化推广?
  9. runloop的mode作用是什么?
  10. 【原创】软件测试基础流程
  11. GitHub桌面版汉化
  12. 推荐oracle exadata,Exadata的一些常见误区
  13. 人脸对齐(一)--定义及作用
  14. 苹果手机注册时显示链接服务器出现问题,苹果手机出现连接到服务器时出现问题是什么回事...
  15. express基本使用步骤
  16. 一不小心把此电脑删了,如何把此电脑添加到桌面?
  17. scikit-image图像处理入门
  18. Android Data Binding 详细介绍与使用
  19. 编程语言中的鸭子类型 Duck Typing
  20. Python图像处理二:图像像素的访问与数据类型

热门文章

  1. Led显示屏设备自发现技术实现-上海灵信
  2. 三月已逝,接下来是忙碌的四月
  3. ERNIE: Enhanced Representation through Knowledge Integration(百度)论文翻译
  4. 分离 Alpha 通道
  5. AirVO: An Illumination-Robust Point-Line Visual Odometry阅读
  6. yaml/yml语法
  7. acmore|acmore.cc1211采油区域1212会议中心1213抢掠计划APIO2009
  8. 金融科技的价值和风险
  9. 面试官吐槽:“软件测试员就是不行!”网友:我能把你面哭了!——软件测试笔试面试题目完全汇总
  10. vue SEO的解决方案