WPF
还是叫明
这个作者很懒,什么都没留下…
展开
-
WPF 3D开发教程(四)
四、实战:展示一个圆柱体4.1圆柱体分解我们知道,3D模型是用三角形表示的,那一个圆该如何表示呢?其实用的就是割圆法,也就是用一个近似的多边形就表示一个圆。下图展示了10、20、50个顶点的正多边形,可以看出,正50边形看上去跟圆已经很接近了。我们的例子就是用正50边形。切分之后,圆柱体变成了如下所示的三棱体的组合:我们需要描述这个三棱体的三个面,共4个三角形(侧面是一个...原创 2020-01-19 15:24:57 · 3272 阅读 · 2 评论 -
WPF 3D开发教程(三)
三、3D模型3D模型就是物体,是3D开发中的主角。我们在第一部分提过,使用三角网格法表示面。而三角形由顶点组成,每个面又有一定的材质,这些都是怎么表示的呢?三角形面由Positions和TriangleIndices两个属性确定,而材质的显示主要由TextureCoordinates和Material两个属性确定。我们具体解释一下这些属性。3.1Positions和TriangleInd...原创 2020-01-17 20:43:15 · 4718 阅读 · 2 评论 -
WPF 3D开发教程(二)
二、相机、光源2.1相机和投影我们一般会用到两种相机,PerspectiveCamera和OrthographicCamera。PerspectiveCamera:透视投影相机,更符合世界实际。OrthographicCamera:正投影相机,不会出现近大远小的效果。更常用的是PerspectiveCamera,所以我们主要介绍这种相机的属性。相机有三个重要属性,我们...原创 2020-01-17 17:04:36 · 3505 阅读 · 1 评论 -
WPF 3D开发教程(一)
一、3D基础知识1.1坐标系我们知道,在2D平面绘图时,WPF使用的坐标系(其实计算机上的图形处理一般都是这样)是以屏幕左上角为原点,向右为x轴正方向,向下为y轴正方向。而WPF的3D坐标系,取区域中心为原点,向右为x轴正方向,向上为y轴正方向,z轴正方向垂直于屏幕指向我们。这是一个右手系,读者可以伸出自己的右手,做下图所示动作。拇指、食指、中指分别代表x、y、z轴。1....原创 2020-01-17 11:18:44 · 9654 阅读 · 0 评论 -
WPF高性能绘图的方法
如果我们只需要在画布中摆放少量的图形元素,那么直接使用Line、Rectangle这些对象是没有问题的。但当我们的图形元素数量巨大(比如说10万个),或是刷新频繁(比如说50毫秒刷新一次)时,WPF就会消耗大量的资源和出现卡顿的现象。为了解决这个问题,我们使用WriteableBitmap,用它作为绘图的基础画布。使用过GDI+的同学应该都听过双缓存,也就是我们先把复杂的绘图过程写到内存里,然后把...原创 2019-05-06 12:42:15 · 12159 阅读 · 5 评论 -
WPF常用的第三方库
这里介绍的第三方库基本都是开源的,并可通过NuGet或GitHub获得。一、PropertyChanged.Fody在使用MVVM模式开发的时候,ViewModel端需要加入RaisePropertyChanged的语句才能更新View。PropertyChanged.Fody解决了这个问题,让开发更简洁。注意如果使用.NET 4.5版本,加入1.50.3版本,否则会有问题。二、S...原创 2019-04-25 16:01:41 · 3629 阅读 · 0 评论 -
用WPF做报表控件(六)
报表打印前面的几项功能,我做的控件都比DevExpress的报表控件性能要好,唯独这个打印要差一些。但这也能用,毕竟打印的功能使用不多,四十页纸之内速度还是可以的。报表控件使用FlowDocument来打印。我们需要把数据重新填充到FlowDocument里面。如下面的代码所示,把数据拼成一个XAML的字符串,然后渲染出页面:StringBuilder flow_doc = new ...原创 2018-09-07 14:45:20 · 1993 阅读 · 0 评论 -
用WPF做报表控件(五)
导出Excel表格导出Excel表格可以使用Office的插件,但我们现场用的电脑不一定是装过Office的,所以也就不能用Office的插件。一开始,我采用了csv格式的文件,直接把后缀改成了xls。这样Excel当然是会打开的。但csv格式太过简单,打开的时候往往不怎么好看。后来终于找到了NPOI这个第三方库,用起来还不错。部分代码如下:public static MemoryS...原创 2018-09-07 14:33:25 · 2411 阅读 · 0 评论 -
用WPF做报表控件(四)
表主体和表尾表主体并没有什么难点,就是一个DataGrid,往里面填充数据即可。表尾显示的是一些统计数据,如平均值、最大值、最小值、累计值等。在这一部分的开发里面,最复杂的是水平滚动条的问题。一开始,我考虑用一个ScrollViewer把整个报表控件包起来。但当我填充大量数据的时候,我发现这样做是有问题的。DataGrid本身只会初始化可视的内容,但当把DataGrid放在ScrollVi...原创 2018-09-07 10:41:46 · 1579 阅读 · 0 评论 -
用WPF做报表控件(三)
表头在上一节里面,我们已经知道,表头其实是一个Grid。那么有两个最需要解决的问题:(1)表头列宽变化时,主体和表尾的列宽怎么跟着变化。(2)如何初始化这个复杂的表头。第一个问题其实并不难,在Grid每一列右侧,都加入一个GridSplitter,然后添加DragDelta和DragCompleted两个拖动事件即可。gs.DragDelta += GridSplitter_...原创 2018-09-07 10:18:06 · 2128 阅读 · 0 评论 -
用WPF做报表控件(二)
总体结构首先我们看一下报表控件最终的效果:我们可以把报表看成是三部分,分别是表头,表主体和表尾。如果我们不使用WPF自带的DataGrid,自己一根线一根线去画的话,这个表格估计也是大工程了。所以一开始,我们就考虑使用DataGrid。但DataGrid怎么做出如图所示的表头和表尾呢?好像根本就不可能啊。尝试过很多方法之后,我必须承认,真的不可能。但我想到了另外一种方法。可以做一个自定...原创 2018-09-07 09:40:14 · 3544 阅读 · 0 评论 -
用WPF做报表控件(一)
DataGrid是WPF自带的报表控件,但其功能简单,很多时候无法满足我们的需求。第三方库(如DevExpress)报表功能强大,但一方面资源消耗比较多,另一方面性能也较差,在一些比较差的电脑上运行很吃力。我之前就尝试过在工控机上使用DevExpress,每次启动都需要等几秒甚至十几秒半分钟,体验实在太差。于是,我觉得自己做一个报表控件。我希望这个报表控件有如下的功能:(1)有丰富的表头。...原创 2018-09-07 09:25:33 · 9957 阅读 · 1 评论 -
WPF开发带水印的输入框
带水印的输入框,就是在文本框没有内容的时候,显示一段浅灰色的文字,当获得焦点时,这段文字消失。我使用了一种比较简单的实现方法:1、创建一个自定义控件。2、添加一个TextBox和TextBlock。TextBox是真正的输入框,而TextBlock则显示水印文字。3、在后台代码控制TextBlock的显示与否就行。修改自定义控件的Text属性,public static ...原创 2018-09-06 15:30:13 · 1003 阅读 · 0 评论