![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
wpf
文章平均质量分 89
分享wpf开发中的各种使用技巧,以及bug解决方法,和架构探讨。
CodeOfCC
c++ 音视频开发
展开
-
C# wpf 运行时替换方法实现mvvm自动触发刷新
我们知道,使用wpf的绑定功能,代码触发界面改变时,需要在属性的setter触发PropertyChanged事件,以达到界面刷新的效果。上一章我们简化了触发流程,但是依然需要在每个属性的setter中调用方法。本章将再进一步简化,实现setter不需要调方法就可以自动触发界面刷新。定义的用于替换属性setter的方法,确保参数类型兼容。设置NoInlining确保不会被内联优化失去函数地址。再方法中触发RaisePropertyChangedEvent。原创 2024-04-29 11:54:44 · 1186 阅读 · 2 评论 -
C# wpf 实现底部嵌入HwndHost
前面三章内容是笔者基于本章研发过程中的附带产物,但是意外的发现第三章可嵌入wpf控件后,本章的意义就变得不那么大了。本章讲述如何从底部嵌入hwnd窗口,以此来做到嵌入窗口不覆盖wpf控件的效果,这种实现思路参考了flutter的一个插件flutter_native_view,其内部实现就用了这种方式。对于wpf实现会复杂一些,因为提供自绘没有BlendMode之类的东西,无法直接消除底部画面,能够使用的方式是Clip,这种方式限制比较多。不过最终还是实现了功能。原创 2024-03-30 00:09:06 · 1185 阅读 · 1 评论 -
C# wpf 嵌入外部程序
实现嵌入各种窗口控件后,其实还会有一种需求:嵌入外部程序,我们有时可能需要嵌入一个浏览器或者或者播放器等一些已有的程序,其嵌入原理也和前面差不多,只要能获取进程的主窗口句柄,然后将窗口嵌入。定义一个依赖属性,提供给xaml设置进程运行的命令行/// 进程运行的命令行以上就是今天要讲的内容,嵌入外部程序还是相对比较容易实现的,而且也有一定的使用场景。创建进程,并能获取到进程的主窗口句柄即可。另外要注意的是管理子进程的退出,其他都问题不大。原创 2024-04-07 09:56:55 · 1321 阅读 · 0 评论 -
C# wpf 嵌入wpf控件
通过前面的章节我们了解到了如何嵌入Hwnd窗口以及WinForm控件,但是嵌入的控件存在覆盖wpf控件的情况,嵌入控件上面无法显示王鹏飞控件,对UI的布局有一定的影响。本文提供一种解决方法,将wpf控件通过HwndHost的方式嵌入到wpf界面中,以实现HwndHost控件上显示wpf控件的功能。因为默认嵌入控件的承载Window使用了AllowsTransparency,如果需要自己定制窗口属性则可以直接使用Window。原创 2024-03-27 13:36:51 · 1500 阅读 · 0 评论 -
C# wpf 嵌入winform控件
wpf的强大界面能力,再加上winform的性能以及灵活性,那基本上什么界面都能够做的很好。比如视频渲染用winform,功能按键用wpf,就能达到性能和界面效果和完美结合。wpf有直接的控件支持嵌入winform控件,使用方法也很简单,网上很容易搜到。之所以编写这篇文章,主要用于记录。原创 2024-03-27 03:00:00 · 1141 阅读 · 0 评论 -
C# wpf 嵌入hwnd窗口
wpf是Direct UI,窗口中只有一个hwnd句柄,大部分控件都是直接在上面绘制的。当我们需要使用不同的渲染方式进行绘制时,就会和控件绘制产生冲突。比如使用opengl渲染3d图形或者视频时,直接在窗口绘制就会出现闪烁,与控件相互覆盖。要解决这个问题就需要,添加一个新的hwnd窗口或控件嵌入wpf窗口中,我们可以通过HwndHost就可以实现这样的功能。原创 2024-03-26 19:56:00 · 1094 阅读 · 0 评论 -
C# wpf 使用GDI实现截屏
wpf截屏时通常可以采用gdi+,调用起来比较方便。使用gdi也能实现截屏,截屏数据也能转成BitmapSource对象,当然调用流程会复杂一些,而且需要引入win32方法,唯一比较容易的就是可以直接绘制异或鼠标。以上就是今天要讲的内容,本文实现了的GDI截屏与GDI+对比性能略差一些,但也是可以一定程度满足使用,比如用来截屏或者制作放大镜。而且有一个好处是可以做到无额外依赖。总的来说,可以作为一种备选方案或者测试方案。原创 2024-03-14 00:58:37 · 1238 阅读 · 0 评论 -
C# wpf利用Clip属性实现截屏框
第二章已经实现过截屏框,实现方法相对简单,也仅支持矩形框。最近使用wpf的clip时发现了一种用法,可以实现穿透效果。那显然我们基于clip也能实现截屏窗口,而且支持任意形状。以上就是今天要讲的内容,有了之前的基础本文实现起来相对容易,当前目前的也是比较初步的功能,但灵活性是比DockPanel要好的,尤其是支持任意形状,这样就有利于后期划线截屏的实现了。原创 2024-01-22 18:01:41 · 908 阅读 · 6 评论 -
C# wpf 获取控件刷新的时机
做wpf开发不像mfc控件的刷新相对同步,wpf的控件改变宽高或者可见性后在下一行代码不会立刻看到效果,而且也没有一种事件可以获取确切的界面刷新后的时机。如果只是进行延迟等待,在不同机器效果是不同的,而且也并没有具体标识说明已刷新界面,这就导致某些场景的功能实现起来会比较困难。本文提供一种获取控件真正界面刷新时机的方法。以上就是今天要讲的内容,本文的做法是笔者曾经在某个论坛看到的建议,然后去尝试实现发现是可行的,后来进一步封装为异步方法。原创 2024-01-16 17:59:35 · 936 阅读 · 0 评论 -
C# wpf 实现任意控件(包括窗口)更多调整大小功能
上一章我们已经实现了任意控件统一的拖动调整功能,能够方便的给任意控件设置拖动调整大小。开发过程中发现还是有些功能可以继续拓展的,比如cs代码触发拖动、自定义模板、交叉拖动、限制拖动范围等功能。有功能实现起来不算太容易,却很有实用价值。原创 2024-01-15 15:12:13 · 3150 阅读 · 4 评论 -
C# wpf 实现任意控件(包括窗口)更多拖动功能
上一章我们以及实现了任意控件统一的拖动功能,以及能够方便的给任意控件添加拖动了。开发过程中发现还是有些功能可以继续拓展的,比如cs代码中移动控件、响应事件后触发拖动、限制拖动范围等功能。原创 2023-11-08 00:49:26 · 1279 阅读 · 0 评论 -
C# wpf 实现桌面放大镜
做桌面截屏功能时需要放大镜,显示鼠标所在位置的放大图像,在wpf中使用Bursh的ViewBox属性可以实现图像放大,桌面的画面则需要截屏了,总的来说还是比较容易实现的。以上就是今天要讲的内容,本文仅仅简单介绍了实现桌面放大镜的方法,关键在于使用Viewbox,截屏的功能因为有现成的所以比较简单,当然本文的方法是简单实现,其实还是可以优化的,尤其是截屏是可以复用Bitmap对象的。总的来说,wpf实现桌面放大镜还是比较容易的,而且效果也很不错。原创 2023-09-09 15:34:21 · 1350 阅读 · 6 评论 -
C# wpf 实现截屏框热键截屏功能
在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里不少的细节需要处理,比如响应热键弹出截屏界面、点击拖出截屏框、截屏区域任意反向拖动、处理不同dpi下的坐标位置等等。以上就是今天要讲的内容,本文介绍了wpf截屏框热键截屏的方法。原创 2023-09-07 00:41:17 · 1297 阅读 · 0 评论 -
C# wpf使用ffmpeg命令行实现录屏
上一章我们实现了截屏界面与功能,接下来可以在此基础上实现录屏功能,录屏采用ffmpeg命令行实现会方便一些,效果也是不错的,当然前提是要对Windows子进程的控制比较熟悉,做出来之后完全可以满足项目使用。........................原创 2022-08-01 21:52:40 · 3253 阅读 · 0 评论 -
C# wpf 无边框窗口添加阴影效果
制作无边框窗口时,系统自带阴影会消失,这时就需要我自己给窗口添加阴影以防止窗口融入背景。添加阴影的方法很简单,直接用effect就可以了,但这里还是有个不容易注意到的细节需要处理,加阴影后窗口最大化可能会有问题。......原创 2022-07-28 23:13:41 · 5034 阅读 · 0 评论 -
C# wpf 使用ListBox实现尺子控件
尺子在客户端开发中有一定的应用场景,比如厘米尺、白板的画线尺、视频剪辑的时间尺。一般可以采用用户控件通过自绘的方式实现,但今天我要讲一个不一样的方法,不使用自定义控件也不用用户控件,只需要ListBox即能实现一把尺子。............原创 2022-07-16 01:11:12 · 1641 阅读 · 2 评论 -
C# wpf style中实现可定制的自定义标题栏
上一章我们实现了在style中自定义标题栏,解决了复用性的问题。但是在实际使用中,还是存在一些问题的,比如有些界面需要放几个菜单在标题栏或者不需要最大化按钮等,就会变得很不灵活。这时候就需要对style进行进一步拓展了。..................原创 2022-07-13 22:48:54 · 4488 阅读 · 0 评论 -
C# wpf 实现截屏框实时截屏功能
在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里有些细节需要处理,比如要隐藏截屏框上的控件避免遮挡,处理不同dpi下的坐标位置。...............原创 2022-07-01 23:56:26 · 2864 阅读 · 9 评论 -
C# wpf 使用DockPanel制作截屏框
做桌面客户端的时候有时需要实现截屏功能,能够在界面上框选截屏,做一个蒙版然后中间选框透明可以移动和改变大小。这个功能是不太好实现的,需要一定的方法,其中使用DockPanel是相对简单直接的实现。..................原创 2022-07-01 00:10:28 · 1325 阅读 · 0 评论 -
C# wpf 实现自定义撤销重做功能
做wpf界面的时候有时需要撤销重做功能,虽然一些wpf控件自带撤销功能,但是在一些复杂的场景还是需要自己实现撤销重做功能,比如自定义的白板或者视频剪辑器等等,本文将介绍如何简单的实现一个撤销重做对象,并提供使用示例。...............原创 2022-06-26 22:38:48 · 1667 阅读 · 0 评论 -
C# wpf 附加属性实现界面上定义装饰器
装饰器是wpf中可以浮在控件上面的一种组件,我们通常可以用来实现一些诸如控件拖动点、提示框、自定义鼠标等界面功能。装饰器的用法其实还是比较复杂的,几乎需要完全再cs中编写所有代码,对于样式要求较高的情况下,完全在cs中些控件的样式是比较困难的。为了改变这种状况,我们可以使用附加属性将装饰器的逻辑封装,提供一个可以在界面上定义的属性。......原创 2022-06-20 23:06:37 · 693 阅读 · 0 评论 -
C# wpf 通过绑定实现控件动态加载
使用wpf开发有时需要动态加载控件,直接再后台写cs代码,对于样式会很难写而且可读性会比较差,这个时候我们就需要想办法完全在xaml中定义动态加载控件的样式,虽然我们可以定义模板放在资源字典中,然后在后台获取模板在加入到界面,但这个过程还是很麻烦的而且与mvvm不兼容。更好的方法应该是使用ItemsControl,ItemsControl作为ListBox的祖先类其使用方法是基本一致的,我们可以自定义其内部的布局,以及元素模板,通过绑定数据源即可实现控件的动态加载,cs端不需要处理任何界面代码。......原创 2022-06-18 23:46:57 · 3621 阅读 · 0 评论 -
ffplay自定义播放器封装C#接口
因为曾经的wpf项目涉及到多种播放功能,拉流、点播、摄像头预览、音频测试、视频剪辑等,将ffplay的接口封装给C#调用实现了那些功能。最近自己新版本的播放模块也做了C#的封装,虽然现在不做C#项目了,但是留着以备不时之需。下面将对dll的接口和功能以及使用方法做一些说明。.........原创 2022-05-13 23:12:06 · 3066 阅读 · 12 评论 -
C# wpf 使用d3d渲染dxva2解码数据
使用dxva2解码渲染的方案是有的,通过句柄关联d3d对象的方式直接渲染,性能相当好,但是在wpf中显然不太合适,嵌入hwnd窗口与wpf绘制不兼容,而且对于键盘事件也会有影响,最好的方式还是使用d3d渲染,本文主要讲述如何将dxva2解码的数据不经过转换,直接渲染到wpf的image上。原创 2022-04-17 01:07:47 · 4317 阅读 · 28 评论 -
C# wpf 使用ffplay实现视频播放器
有了前面几章的视频渲染方法,再结合笔者已有的一个定制化ffplay播放器《基于ffplay改造成自定义多开播放器》,我们可以很容易的在wpf中实现一个播放器,这个播放器可以支持本地播放、摄像头播放、网络点播、rtmp和rtsp拉流。原创 2022-04-01 23:02:55 · 10595 阅读 · 17 评论 -
C# wpf slider实现显示进度、拖动定位、点击定位功能
实现一个播放器,必然需要一个进度条,一个基本的进度条通常显示进度、拖动定位,也可以点击定位,在wpf通常使用slider实现,改变其Value可以显示进度,但是拖动和点击也使用Value或ValueChanged时就会产生冲突,直接死循环了,所以我们需要将这3个功能区分开来,用不同的方式去实现。...原创 2022-03-29 22:30:40 · 6710 阅读 · 17 评论 -
C# wpf 使用GDI+实现截屏
wpf做屏幕录制或者屏幕广播之类的功能时需要实现截屏,在C#中比较容易实现的截屏方法是使用GDI+,本文将展示GDI+截屏的具体实现方案。原创 2021-12-28 14:24:45 · 5304 阅读 · 2 评论 -
C# wpf Bitmap转换成WriteableBitmap(BitmapSource)的方法
在wpf中我们有时候需要截屏或者获取鼠标标时通常拿到的是Bitmap,如果要作显示,则需要将Bitmap转成wpf控件兼容的图像对象,比如转成BitmapSource在网上已经可以查到实现方法,这里提供一种将Bitmap转成WriteableBitmap的方法。原创 2021-12-12 00:18:24 · 3907 阅读 · 0 评论 -
C# wpf 附加属性实现任意控件拖动调整大小
系列文章目录第一节 Grid内控件拖动第二节 Canvas内控件拖动第三节 任意控件拖动第四节 窗口拖动第五节 附加属性实现任意拖动(本节)文章目录系列文章目录前言一、如何实现?1.定义附加属性2.整合功能3.关联功能二、完整代码三、使用示例1.拖动控件2.拖动窗口总结前言前面几章讲了控件拖动的几种方法,根据不同的布局可以有不同的拖动方式。本章主要讲的是利用附加属性对几种拖动方式进行封装,实现复用性,否则直接注册事件的方式在同界面多个控件中是几乎没有复用性的,实现起来很不方便。通过将上原创 2021-12-08 23:19:19 · 5714 阅读 · 0 评论 -
C# wpf 无边框窗口实现拖动调整大小
文章目录前言一、如何实现?1.继承Adorner2.使用Thumb3.实现拖动逻辑三、完整代码四、使用示例总结前言在《C# wpf Grid中实现控件拖动调整大小》中我们实现了Grid中的控件动态调整大小,对于自定义的无边框窗口也可以使用类似的方式实现。虽然能查到的方案有通过Window Api的和通过WindowChrome实现的,一个是对系统有依赖还一个是依赖.net版本,这里提供一种相对轻量的实现方法。一、如何实现?1.继承Adorner通过装饰器的方式添加8个方位拖动区域在窗口上,这原创 2021-11-25 22:42:40 · 4551 阅读 · 2 评论 -
C# wpf Grid中实现控件拖动调整大小
文章目录前言一、如何操作?二、如何实现?1.继承Adorner2.使用Thumb3.实现拖动逻辑三、完整代码四、使用示例总结前言在《C# wpf Canvas中实现控件动态调整大小》中我们实现了Canvas中的控件动态调整大小,由于Grid也是可层叠布局,在Grid中也是可以实现动态调整大小的。一、如何操作?8个点方放置在控件的8个方位上,通过拖动这些点对控件进行拉伸或缩小,示意图如下:二、如何实现?1.继承Adorner通过装饰器的方式添加8个点在控件上,这样既可以不影响控件布局,原创 2021-11-23 13:44:06 · 5504 阅读 · 7 评论 -
C# wpf Canvas中实现控件拖动调整大小
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例原创 2021-11-22 22:06:39 · 3940 阅读 · 0 评论 -
C# wpf 附加属性实现任意控件(包括窗口)拖动
系列文章目录第一章 Grid内控件拖动第二章 Canvas内控件拖动第三章 任意控件拖动第四章 窗口拖动第五章 附加属性任意控件拖动(本章)文章目录系列文章目录前言一、如何实现?1.定义附加属性2.整合功能3.二、完整代码三、使用示例总结前言前面几章讲了控件拖动的几种方法,根据不同的布局可以有不同的拖动方式。本章主要讲的是利用附加属性对几种拖动方式进行封装,实现复用性,否则直接注册事件的方式在同界面多个控件中是几乎没有复用性的,实现起来很不方便。提示:以下是本篇文章正文内容,下面原创 2021-11-18 18:01:39 · 4026 阅读 · 0 评论 -
C# wpf 实现任意控件拖动
前言在《C# wpf 实现Grid内控件拖动》和《C# wpf 实现Canvas内控件拖动》实现了两种容器内部控件的拖动,所以拖动功能只能局限于两种容器中使用。其实还有一种方法实现拖动,任意控件都可以拖动。一、如何实现?1.注册鼠标事件拖动的控件需要注册3个鼠标事件分别是,鼠标按下、鼠标移动、鼠标弹起。以Button为例:<Button PreviewMouseDown="Button_MouseDown" PreviewMouseMove="Button_Mo原创 2021-11-17 20:01:15 · 9112 阅读 · 2 评论 -
C# wpf 实现Canvas内控件拖动
前言有一些业务场景中我们需要拖动控件,上一篇文章《C# wpf 实现Grid内控件拖动》在Grid中实现的控件拖动,在Canvas中也可以实现控件拖动,通过设置Canvas的附加属性即可,根据鼠标的移动,设置相应Canvas的Left、Top。一、如何实现?1.注册鼠标事件拖动的控件需要注册3个鼠标事件分别是,鼠标按下、鼠标移动、鼠标弹起。以Button为例:<Button PreviewMouseDown="Button_MouseDown" PreviewM原创 2021-11-17 16:14:47 · 5703 阅读 · 3 评论 -
C# wpf 实现Grid内控件拖动
前言有一些业务场景中我们需要拖动控件,在Grid中就可以实现控件拖动,通过设置Margin属性即可,根据鼠标的移动,设置相应的Margin的Left、Top,当然有时也不是直接设置的,需要根据HorizontalAlignment、VerticalAlignment值有不同的计算方法。一、如何实现?1.注册鼠标事件拖动的控件需要注册3个鼠标事件分别是,鼠标按下、鼠标移动、鼠标弹起。以Button为例:<Button PreviewMouseDown="Button_MouseDown原创 2021-11-16 22:39:52 · 4088 阅读 · 0 评论 -
C# wpf 使用WriteableBitmap渲染视频
文章目录前言一、如何实现?1.创建WriteableBitmap2.关联Image3写入数据三、示例1.示例代码2.效果预览四、像素格式的讨论五、性能对比总结前言通过《C# wpf 使用d3d渲染yuv视频数据》我们实现了在Image控件中显示视频,解决了控件绘制不兼容问题。但如果有时候不想依赖D3D时,还有一种方案实现视频的渲染,使用wpf的WriteableBitmap,WriteableBitmap的祖先接口有ImageSource,即可以作为Image的Source显示画面。我们只需往Writ原创 2021-11-14 00:00:16 · 5734 阅读 · 2 评论 -
C# wpf 使用d3d渲染yuv视频数据
文章目录前言一、如何实现1.继承D3DImage2.关联D3D93.写入数据二、完整代码三、使用方法三、效果预览总结前言在《C# wpf 通过HwndHost渲染视频》中介绍了一种在wpf渲染视频的方法,但是有一个缺点,和wpf的控件不太契合,无法在播放框放控件,也无法改变形状,导致一些界面需求较难实现。为了解决这一问题,找到了一种可以和wpf绘制兼容的视频渲染方式,使用d3d渲染。一、如何实现我们首先选择用Image控件来显示视频,Image控件有个Source属性,类型是ImageSourc原创 2021-11-12 22:44:48 · 7048 阅读 · 41 评论 -
C# wpf 通过HwndHost渲染视频
文章目录前言一、如何实现二、使用方式三、示例总结前言日常开发中,特别是音视频开发,需要在界面上渲染视频,比如制作一个播放器、或者视频编辑工具、以及视频会议客户端。通常拿到的是像素格式数据,此时需要渲染到wpf窗口上就需要一定的方法,本文介绍一种通过hwnd渲染的方法,控件既能提供hwnd又能嵌入wpf窗口里。提示:以下是本篇文章正文内容,下面案例可供参考一、如何实现通过继承HwndHost并实现抽象方法即可作为一个带句柄的wpf控件在xaml中使用,代码如下:class NativeHost原创 2021-11-11 21:17:18 · 4300 阅读 · 2 评论 -
C# wpf style实现PART可替换控件(方法2)
文章目录前言一、什么是PART可替换控件?二、如何实现?1.定义参数2.关联参数2.使用参数三、完整代码四、使用示例个性化标题栏总结前言本文是《C# wpf style实现PART可替换控件》的另一种实现,是一种更优的方法,可以完全不涉及cs代码,设计器也可以实时预览。一、什么是PART可替换控件?参考《C# wpf style实现PART可替换控件》,在此处不再赘述。二、如何实现?核心方法是:《C# wpf Style中使用参数的方法》1.定义参数在Style的资源字典中定义一个用于原创 2021-11-10 17:55:12 · 915 阅读 · 0 评论