安装Openxml sdk 首先,我们先安装nuget的需要的有关的Openxml sdk,我们开源了解析pptx的Openxml拍平层,下面两种方式都可以安装: nuget包管理器控制台: Install-Package...种直线,分别设置7种能够设置的虚线类型,PPTX的显示效果是这样的: 然后解析代码如下,解析主要逻辑部分: private void PptxToGeometry(string filePath...} } } this.ListBox.ItemsSource = lines; } PPTX映射成WPF...: 我们可以看到几乎是接近的效果了,当然你也可以根据我的代码去微调更精确的值,只需要稍微改下GetDashArrayByPresetLineDashValues方法内相对应的值即可 后话 实际上,openxml...文档是给出了PresetDash的值的,大致如下: 但是其值跟WPF的设置Dash的DoubleCollection不对应,因此以上的映射值都是我自己微调的 源码 BlogCodeSample/PptDashConverToWpfSample
如果不用到 Win32 方法,可以尝试遍历所有窗口获取 Owner 判断,不过此方法仅仅适合只有一个主线程 通过 Win32 的 EnumChildWindows 可以拿到某个窗口句柄的所有子窗口,大概用法如下...) gcChildhandlesList.Target; childHandles.Add(hWnd); return true; } } 使用方法是先拿到窗口的句柄...,然后传入 GetAllChildHandles 方法,就可以拿到所有子窗口的句柄 var windowInteropHelper = new WindowInteropHelper...PINVOKE: Getting all child handles of window · Software adventures and thoughts 使用 EnumWindows 找到满足你要求的窗口
前言 默认创建的窗口是可以拖拽放大缩小的,但是如果窗口设置为透明,就不能拖拽了。
在 WPF 中,形状可以使用 StrokeThickness 定义边框的粗细,而边框和形状元素的大小的关系受到这个属性的影响。...我比较推荐 WPF 的这个设计,固定了矩形的宽度和高度,那么边框的大小是向内的。...因为这样设计起来比较好计算 而 SVG 的行为和 WPF 的不相同,在 SVG 里面是使用矩形的边框作为中心,向两边填充。...我比较不推荐 SVG 的设计,因为这样子意味着如果修改了矩形的边框,那么矩形的视觉大小也就被更改了 Ellipse 对于封闭的其他图形,如 Ellipse 来说,行为和矩形相同,都是向内撑开的,如下面代码...Geometry 线条的中间向两边填充 ---- 本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E5%BD%A2%E7%8A%B6%
目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息的窗口和系统资源通知窗口 (3)用于用户交互的可见窗口 (4)...用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新 WPF内部的5个窗口 对于Windows系统来说,它是一个消息系统,消息系统的核心就是窗口...对于WPF来说也是如此。那么WPF内部为什么需要窗口,又存在哪些窗口呢?...接下来我会来介绍究竟这5个Win32的窗口如何帮助WPF处理消息,我会根据每个窗口创建的顺序来介绍。...第五步,在窗口过程中,优先级队列当中取一个DispatcherOperation。
本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 foreach(Window window...in Application.Current.Windows ) { Console.WriteLine(window.Title); } 如果需要获取一个线程的窗口,请看代码...handleList.Add(hWnd); return true; }, IntPtr.Zero); } return handleList; } WPF...一个空的 WPF 程序有多少个窗口 WPF 内部的5个窗口之 MediaContextNotificationWindow
本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 foreach(Window window...in Application.Current.Windows ) { Console.WriteLine(window.Title); } 如果需要获取一个线程的窗口,请看代码...一个空的 WPF 程序有多少个窗口 WPF 内部的5个窗口之 MediaContextNotificationWindow ---- 本文会经常更新,请阅读原文: https://...8F%A3.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。...欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被监听到。然而,如果我们希望监听的是整个应用程序中所有的事件呢?...路由事件的路由可并不会跨越窗口边界呀? 本文将介绍我编写的应用程序窗口监视器,来监听整个应用程序中所有窗口中的路由事件。这样的方法可以用来无时无刻监视 WPF 程序的各种状态。...于是,我们只需要遍历 Windows 集合便可以获得应用程序中的所有窗口,然后对每一个窗口监听需要的路由事件。...于是,一开始的时候,我们可以监听一些窗口的激活事件。如果执行这段初始化代码的时候没有任何窗口是激活的状态,那么就监听所有窗口的激活事件;如果有一个窗口是激活的,那么就监听这个窗口的取消激活事件。...} 在 Window_Activated 和 Window_Deactivated 事件中,我们主要也是在做初始化。
本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法。在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边。...WPF属性,否则会破坏RestoreBounds,且WPF窗口自身在最大化时,不会修改 Left Top Width Height 属性 {...,此类型依赖一些 Win32 方法的定义,这部分我就不在博客中写出,大家可以从本文最后获取所有源代码 /// /// 用来使窗口变得全屏的辅助类 /// 采用设置窗口位置和尺寸...WPF 属性与 Win32 位置一致,防止有逗比全屏后改 WPF 的属性,发生一些诡异的行为 //下面这样做其实不太好,会再次触发...无盈利,不卖课,做纯粹的技术博客
目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息窗口以及系统资源通知窗口 (3)用于用户交互的可见窗口 (4)...用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新 处理应用程序激活和系统关闭的窗口(Window 2#) 创建时机:在调用Application.Run...WPF为了安全起见没有让UI窗口来处理应用程序激活,反激活,以及操作系统关闭时对应的消息,而是内部创建了一个隐藏的窗口,专门用来接收WM_ACTIVATEAPP和WM_QUERYENDSESSION两个...WPF在应用出现的MainWindow在初始化完成后,会创建一个隐藏的窗口,专门处理来自系统相关资源更新后的消息,比如WM_ThemeChanged,WM_SystemColorChanged,WM_DisplayChange...跟Window2#的初衷类似,为了安全起见,没有通过可见的UI窗口来处理这些消息,而是内容创建了这个隐藏的Window4#窗口来处理这些消息,确保UI窗口可以安全的更新由于系统Theme及相关资源改变后的表现
问题描述 我将程序边框隐藏后无法拖动程序移动 解决方法 用 place 方法直接设置窗口的位置。...# 定义鼠标按下事件,用于实现窗口拖动 def on_mouse_down(event): global last_x, last_y last_x, last_y = event.x,...event.y # 定义鼠标移动事件,用于实现窗口拖动 def on_mouse_move(event): x, y = event.x_root - last_x, event.y_root...window.bind("", on_mouse_down) window.bind("", on_mouse_move) 使用上面的代码加到代码的最后面就可以实现拖动了
本文告诉大家在 WPF 内部的5个窗口的 MediaContextNotificationWindow 是做什么的 在本文开始之前,希望大家先看下面的博客 WPF的消息机制(一)- 让应用程序动起来 WPF...的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口 WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口 而 MediaContextNotificationWindow...是在 MediaContext 的构造函数创建的,用来提供给创建他的 MediaContext 可以有接收和转发向顶级窗口广播的窗口消息的能力 在 MediaContextNotificationWindow...因为 DWM 通知只是广播给最顶层的窗口。...通过这个方式就可以让 WPF 的 MediaContext 接收到最顶层窗口的消息 代码请看 https://referencesource.microsoft.com/#PresentationCore
本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机。...这是一个开发时的辅助机制,用来让开发者不要随便弹出窗口,我又好奇这个监控模块是如何监控到我弹出一个窗口的,学习了监控模块的机制,就写了这个博客 在 WPF 里面,可以通过 EventManager 监听全局的路由事件...于是就可以进行监控窗口创建显示 监听窗口的 SizeChangedEvent 路由事件是比较靠谱的方式,这个有一点点违反开发者的想法,开发者默认想的是使用 LoadedEvent 事件。...但是在 WPF 里面做了一些性能优化,如果一个窗口没有 XAML 或者是没有任何代码监听了 Loaded 事件,那将不触发 LoadedEvent 路由事件。...也可以在事件里面对每个窗口注入一些有趣的逻辑,或者是监听窗口的各个事件,输出更多日志,让开发者可以通过日志了解到当前有哪些窗口依然还在显示 这是另一位大佬写的代码,请看 https://gist.github.com
在 WPF 中,如果想要使用代码控制,让某个窗口作为当前用户的输入的逻辑焦点的窗口,也就是在当前用户活动的窗口的最上层窗口,默认使用 Activate 方法,通过这个方法在大部分设备都可以做到激活窗口...组合可以让窗口作为当前用户活动的,即使窗口之前是最小化或隐藏,都可以通过 Show 的方法显示 但是某些设备窗口被盖在其他的窗口的下面,此时的窗口的 window.IsActive 还是 true 但是调用...Activate 不会让窗口放在上层 我在网上看到好多小伙伴调用了 SetForegroundWindow 方法,其实现在 WPF 是开源的,可以看到 Window 的 Activate 方法是这样写...Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原 5.最后SetForegroundWindow 在 WPF 中对应的更改窗口的顺序使用的是...Topmost 属性,同时设置顺序需要做一点小的更改 在 WPF 中通过 c# - Bring a window to the front in WPF - Stack Overflow 可以了解到如何用
今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID. // 111902.cpp : Defines ...UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { printf("OnTimerProc: %6d/n",idEvent); } 对应计时器ID的输出的是一个随机数字...原来在msdn中 nIDEvent [in] Specifies a nonzero timer identifier....注:只有当hWnd参数为非空时,计时器的ID为设置的 nIDEvent, 系统为你自动生成一个计时器ID,可由返回时值获取.
好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口 在 WPF 内部的5个窗口之 MediaContextNotificationWindow...听说有五个窗口 可以通过 user32 的 EnumThreadWindows 找到一个线程的窗口 delegate bool EnumThreadDelegate(IntPtr hWnd...id 的方法需要先获取进程,在 Loaded 之后尝试获取 WPF 的进程,通过 Process.GetCurrentProcess() 可以拿到当前的进程 通过 process.Threads 可以拿到进程的线程...14 个窗口,但是如果将代码移动到 WPF 的构造函数,会发现只有两个窗口 public MainWindow() { var handleList...内部的5个窗口之 MediaContextNotificationWindow
而 MediaContextNotificationWindow 是在 MediaContext 的构造函数创建的,用来提供给创建他的 MediaContext 可以有接收和转发向顶级窗口广播的窗口消息的能力...,这个窗口是不可见的,这样就可以接受到 WM_DWMCOMPOSITIONCHANGED 和其他的 DWM 通知。...因为 DWM 通知只是广播给最顶层的窗口。...通过这个方式就可以让 WPF 的 MediaContext 接收到最顶层窗口的消息 代码请看 https://referencesource.microsoft.com/#PresentationCore...MediaContextNotificationWindow.cs,969a2072bf29a084 ---- 本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/WPF
好多小伙伴说 WPF 的程序有五个窗口,但是我尝试使用了 EnumThreadWindows 去获取的时候居然拿到了 10 多个窗口 在 WPF 内部的5个窗口之 MediaContextNotificationWindow...听说有五个窗口 可以通过 user32 的 EnumThreadWindows 找到一个线程的窗口 delegate bool EnumThreadDelegate(IntPtr hWnd...id 的方法需要先获取进程,在 Loaded 之后尝试获取 WPF 的进程,通过 Process.GetCurrentProcess() 可以拿到当前的进程 通过 process.Threads 可以拿到进程的线程...14 个窗口,但是如果将代码移动到 WPF 的构造函数,会发现只有两个窗口 public MainWindow() { var handleList...内部的5个窗口之 MediaContextNotificationWindow ---- 本文会经常更新,请阅读原文: https://lindexi.gitee.io/post/WPF
foreach (Window item in Application.Current.Windows) { if (item.Title == "") continue; // 跳过无标题窗口...= "父窗口标题") item.Close(); } WinForm时这样操作的: // 遍历并关闭所有子窗口 FormCollection childCollection = Application.OpenForms...= this.Title) childCollection[i].Close(); } WPF中时这样操作的: // 遍历并关闭所有子窗口 Window[] childArray = Application.Current.Windows.Cast...= this.Title) item.Close(); } 总结, 注意WPF中调试要排除无标题窗口,否则会导致程序被关闭。...这里的无标题窗口是WPF的界面调试器,如果它被关闭会导致被调试的程序也被关闭,Release程序可以不用对无标题窗口进行排除。
1. 先看图片 2. 这是styleresource;应该还能精简掉很多; dd <Window.Resources> <Color ...