
WPF编程之路
文章平均质量分 56
分享wpf编程中遇到的问题,以及解决方案。
分享wpf设计UI的一些技巧。
分享Blend设计wpf时相关方法技巧。
muzizongheng
熟悉.net技术栈、web技术栈、ELK、xml/xslt/xsd、mfc、python等;熟悉DICOM、IHE熟悉敏捷、DDD
展开
-
WPF中应用IoC框架
CastleWindsor是.net平台下著名的IoC框架,WPF中使用非常方便。 建立一个空的WPF工程 上传App.xaml中的StartUri 重载App类里的OnStartUp方法 用nuget添加CastleWindsor工程引用,注意的是目前支持的最低的.net framework版本为4.5 在App类中声明成员变量 p...原创 2019-09-29 14:26:47 · 2898 阅读 · 0 评论 -
MVVM的再次理解
MVVM的理解MVVM:Model、View、ViewModel我要着重介绍的是ViewModel,从字面意思就能看出ViewModel是View层的Model,也就是说ViewModel就是View的逻辑层。 ViewModel就是为了存储View的相关状态、行为,而不仅仅是View绑定的一些字段。举个例子:比如界面当前的编辑状态、选择状态等等状态都是Vi...原创 2019-09-29 14:25:36 · 320 阅读 · 2 评论 -
WPF绑定语法的笔记
Mode, Default、OneTime、OneWay、TwoWay、OneWayToSource。Default看情况,一般是OneWay,一些用户可编辑的属性默认是TwoWay。这个主要是通过注册依赖属性时的FrameworkPropertyMetadataOptions中的BindsTwoWayByDefault决定。可以通过获取或者更改FrameworkPropertyMetadataO...原创 2018-12-20 16:56:45 · 989 阅读 · 0 评论 -
WPF标记扩展的笔记
命名空间:http://schemas.microsoft.com/winfx/2006/xaml语法: {}, 左右大括号从System.Windows.Markup.MarkupExtension继承的类 X:Key, 保证唯一性,类似Dictionary的key, 一般用在ResourceDictionary里, 即用x:key定义ResourceDictionary的...原创 2018-12-20 16:55:38 · 821 阅读 · 0 评论 -
WPF中音视频文件的BuildAction只能为Content
当应用程序分发音视频文件时, 只能指定BuildAction为Content,并且CopyToOutPut设置为IfNew或者Always。https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/multimedia-overview NoteWhen distributing...原创 2018-12-20 16:53:58 · 283 阅读 · 0 评论 -
Wpf中系统自带的RoutedCommand并不包含命令的实现逻辑
如题, 即系统自带的ApplicationCommands等并不包含命令的实现逻辑,实现逻辑在命令目标内已实现。 比如ApplicationCommands.Copy命令, 实现逻辑是TextBox等控件内部实现的。...原创 2018-12-20 16:51:55 · 441 阅读 · 0 评论 -
WPF中Button的Click既有事件处理方法又有command绑定, 如何执行及先后顺序是?
在ButtonBase的源码中看到一段有趣的代码: /// <summary> /// This virtual method is called when button is clicked and it raises the Click event /// </summary> protected...原创 2018-12-20 16:50:15 · 7986 阅读 · 0 评论 -
WPF中MsgBox的弹出会中断路由事件的传递
在WPF的Tunnel(Preview)路由事件中用MessageBox.Show弹出对话框后,会中断后续的Bubbling事件。根据MSFT的解释是,MessageBox弹出时获取到了焦点,导致路由事件的链断了。 相关说明: MessageBox prevent RoutedEvent routing Hi Fortnum, I performed a test bas...原创 2018-12-20 16:48:29 · 490 阅读 · 0 评论 -
C#中把不能避免的装箱定义为Static
在wpf源码中看到一个有趣的设计: internal static class BooleanBoxes { internal static object TrueBox = true; internal static object FalseBox = false; internal static object...原创 2018-12-20 16:43:06 · 220 阅读 · 0 评论 -
Xaml的反序列化的逻辑
上图 从上图可以知道一个xaml的反序列化的基本步骤1.解析namespace2.调用StartObject创建根节点3.每个xml的element都是一个object,attribute是一个value https://docs.microsoft.com/zh-cn/dotnet/api/system.xaml.xamlnodetype?view=netf...原创 2018-12-20 16:40:34 · 394 阅读 · 0 评论 -
WPF中的波浪线画法
比如说做一个类似这样的曲线界面, 可以动态添加格子, 每个格子可以调整曲线的波峰波谷。 此时可以用到PolyBezierSegment 类 即:不断的添加2个控制点和终止点。 伪代码如下:var bezierSegment = new PolyBezierSegment(); for (int i = 0; i < periodCo...原创 2018-12-20 16:39:13 · 1772 阅读 · 0 评论 -
WPF中如何在Image控件中显示动态生成的Path?
1. Image控件的Source支持DrawingImage2.DrawingImage可以通过GeometryDrawing类来支持3.在GeometryDrawing的Geometry中动态生成想要的Path Geometry 伪代码:(1.画矩形) //rectangle var pathFigure2 = new PathFigure...原创 2018-12-20 16:36:03 · 2081 阅读 · 0 评论 -
WPF的Binding的ConverterParameter不支持绑定时的绕行方案
如题, 有时候我们需要在xaml中的绑定中传递多个动态值,进行综合计算, 由于ConverterParameter不是依赖属性,因此不支持绑定。 此时可以用IMultiValueConverter来实现。...原创 2018-12-20 16:34:59 · 2442 阅读 · 0 评论 -
wpf中GIF图像的播放
wpf中可以用MediaElement来播放gif, 只不过存在2个问题。 1. 默认没有循环播放2.不支持透明度 最终效果还是第三方库WpfAnimatedGif更好用。 地址:https://github.com/thomaslevesque/WpfAnimatedGif 可以在vs里通过nuget直接下载使用。...原创 2018-12-20 16:24:04 · 1322 阅读 · 0 评论 -
WPF中如何继承一个UserControl
有个场景, 自定义了一个控件BaseControl, 它从UserControl继承的。由于业务需求, 公开了一个protected virtual void Process() 函数。 在不同的场景下可以继承BaseControl并重新Process()方法,从而实现不同的逻辑。 BaseControl的cs如下: public partial class BaseControl...原创 2018-12-20 16:23:13 · 2907 阅读 · 0 评论 -
WPF核心类图谱
有空列出WPF核心类图谱,如下:原创 2016-05-11 22:44:59 · 7929 阅读 · 0 评论 -
(一):WPF体系结构
WPF的体系结构一般如下:(MSDN)(维基百科)我们重点介绍下第2张图,它细化了第一张图的内容。整个体系分为3层1.托管WPF层PresentatinFoundation 提供布局、样式、控件、2D、3D、文字、图像、动画、媒体、数据绑定、文档PresentationCore 主要是MIL的托管包装,提供可视化系统,创建可视化树的一些类并负责渲染。比如Visual等核心类CLR 大家熟知的公原创 2016-05-08 17:33:06 · 5764 阅读 · 0 评论 -
WPF知识图
空闲时间我列了下WPF的知识图谱, 如下:原创 2016-05-08 17:27:34 · 5100 阅读 · 0 评论 -
答网友疑问:如何动态设置ItemControl的GroupStyle
首先,要说声对不起,因为我很少看网页里公众号的留言,因此有些都没看到, 或者看到后已经无法回复。今天看到@鱼儿 问到一个问题这个问题一般就是各种Selector来实现, 比如DataTemplateSelector, 或者这次要用到的StyleSelector。具体示例如下:1.在资源中定义不同的Group 的style2.实现后端的GroupStyleSelector3.前端xaml中声明资原创 2016-04-22 01:08:32 · 4386 阅读 · 1 评论 -
WPF中ErrorTemplate导致的空引用at MS.Internal.Controls.TemplatedAdorner.MeasureOverride(Size constraint)
最近遇到一个崩溃,dump信息如下:Object reference not set to an instance of an object.at MS.Internal.Controls.TemplatedAdorner.MeasureOverride(Size constraint) at System.Windows.FrameworkElement.MeasureCore(Size原创 2016-03-09 21:30:55 · 2096 阅读 · 2 评论 -
WPF中抛出NullReferenceException:System.Windows.Markup.IStyleConnector.Connect(Int32, System.Object)
最近遇到一个情况,应用起来就崩溃, 查看dump信息如下:0:017> !peThe version of SOS does not match the version of CLR you are debugging. Pleaseload the matching version of SOS for the version of CLR you are debugging.CLR Ve原创 2016-03-01 20:08:20 · 3513 阅读 · 0 评论 -
WPF的TextBox抛出InvalidOperationException异常:Cannot close undo unit because no opened unit exists.
最近遇到一个问题,应用使用过程中突然崩溃,查看dump发现异常信息如下:UI dispatcher has encountered a problem:无法关闭撤消单元,因为不存在已打开的单元。在 at MS.Internal.Documents.UndoManager.Close(IParentUndoUnit unit, UndoCloseAction closeAction) at原创 2016-02-29 19:07:10 · 3124 阅读 · 3 评论 -
WPF中的DataGrid的RowDetail显示问题
背景:.net 4.0中的DataGrid如果我们把RowDetail的内容弄的很大, 超出当前屏幕可显示的范围。那么当我们DataGrid按行滚动时,拖到滚动条只能看到下一行,前一行的rowDetail看不见的部分并不会因为拖到滚动条就能看到。原因我们也说了, 因为我们按照行滚动而不是按照像素滚动。解决方案:如果要看到RowDetails,只能按照像素滚动。 但在.net 4.0上,一旦设置原创 2016-02-28 22:45:42 · 4911 阅读 · 0 评论 -
WPF的TreeView执行ExpandSubtree时抛出异常System.NullReferenceException
最近拿到一个dump,有应用崩溃,通过查看dump,异常信息如下:0:012> !peException object: 0000000005187278Exception type: System.NullReferenceExceptionMessage: Object reference not set to an instance of an object.Inn原创 2016-02-27 21:18:33 · 3059 阅读 · 0 评论 -
WPF输入框Paste时出错,IDataObject的GetData抛出OutOfMemoryException
现象:客户在使用过程中,在输入框粘贴时,程序崩溃分析:从dump和log看到是:Insufficient memory to continue the execution of the program. at System.Runtime.InteropServices.ComTypes.IDataObject.GetData(FORMATETC& format, STGMEDIUM& med原创 2016-02-01 19:16:39 · 2322 阅读 · 0 评论 -
ScrollViewer滚动到底来触发加载数据的Behavior
最近项目中遇到加载数据的性能问题, 原因是.net4.0的虚拟化支持不够完成,有好多bug在4.5才修复。 我们只能利用大家通用的做法来延迟加载数据:每次加载固定少量的数据,当拖动到底后,继续加载后续相同数量的数据。思路:监听ScrollViewer的VerticalOffsetProperty,如果值达到允许滚动的高度ScrollableHeight,则发出event通知外部处理加载逻辑。使用方原创 2016-01-06 13:06:41 · 3310 阅读 · 0 评论 -
wpf工程中在Xaml文件下添加多个cs文件
在wpf工程中我们添加一个Window或者UserControl都会建立2个文件, xxx.xaml和xxx.xaml.cs.而且一般cs文件在xaml文件下面。有这样的一个场景,大家都知道这些cs中class都是Partial,我们利用Partial把不同的功能放到不同的cs文件里。但默认创建的cs文件不会在xaml文件下面。解决方法很简单:打开csproj文件, 找到对应的cs文件。 添加De原创 2015-11-26 19:45:19 · 8175 阅读 · 5 评论 -
禁用WPF中DataGrid默认的鼠标左键拖动多选行的效果
最近项目上有需求要做DataGrid的行的拖拽功能, 有个很现实的问题就是鼠标左键按下是拖拽还是多选。查看了DataGrid的源码发现,系统内部会在鼠标按下的时候CaptureMouse,然后设置私有变量来保存多选标志, 在鼠标MouseMove的时候根据变量判断是否多选。 private bool _isDraggingSelection;原创 2015-11-12 11:34:56 · 5661 阅读 · 2 评论 -
WPF中DependencyObject与DependencyProperty的源码简单剖析
Windbg调试WPF的依赖属性中提到了wpf的DependencyObject中DependencyProperty是如何调试查看的。从中我们看出DO(DependencyObject)与 DP(DependencyProperty)一些内部实现。这篇文章我们就从源码入手, 让大家了解下依赖对象中依赖属性的值的获取和赋值。我们先看个DP注册的例子:public class MyStateCont原创 2015-08-01 15:07:59 · 5212 阅读 · 0 评论 -
WPF 后台Render线程崩溃, Exception from HRESULT: 0x88980406
最近遇到一个问题,窗体在Loaded同时Resize会出现黑屏或者直接崩溃, 调查发现是WPF后端的Render线程渲染UI到DirectX时崩溃。硬件环境:WES7 + .Net4.0关于WPF有2个线程的解释如下:WPF 应用程序从两个线程开始:一个用于处理呈现,一个用于管理 UI。呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入、处理事件、绘制屏幕以及运行应用程序代码。遇到的这个问题就原创 2015-07-22 19:30:17 · 6443 阅读 · 0 评论 -
Windbg调试WPF的依赖属性
我们用wndbg调试时,很多时候需要查看某个控件的依赖属性值。比如:我们查看DataGridColumnHeader的Content依赖属性 1.我们用到的windbg的命令有:!do, !da -details, .formats 2.利用!do查看依赖对象的成员变量, 找到具体依赖属性的地址0:000> !do 00000000039a71d8Name: System.Wi原创 2015-07-09 20:44:52 · 2166 阅读 · 0 评论 -
WPF内部DeliverEvent读锁和PrivateAddListener写锁导致死锁
准备工作1.对失去响应进程创建转储文件2.配置该进程的pdb文件3.复制该进程所在机器的系统dll(sos.dll, clr.dll, mscordacwks.dll)4.配置系统dll的pdb文件路径, 或者直接从msdl.microsoft/download/symbols下载(注意端口是否被封)分析过程:1.利用~*e !clrstack得到UI线程的ID 为122.利用~12e !cl原创 2015-07-09 19:54:07 · 2195 阅读 · 0 评论 -
wpf中的默认右键菜单中的复制、粘贴、剪贴等没有本地化的解决方案
现象:wpf开发中经常会遇到自己的界面已经本地化了, 但是系统默认的一些文字没有本地化,比如:TextBox的右键菜单中Cut,Paste,Copy没有本地。原因:机器装中.Net framework对应的Language pack没有装。解决方法:比如.net framework 4.0 的language pack的下载地址:https://www.microsoft.com/en-us/原创 2015-07-07 22:49:14 · 3590 阅读 · 0 评论 -
WPF文字渲染相关的问题及解决
wpf中经常遇到各种和文字渲染有关的问题, 现在列举下现象和解决方案。(1)现象: 文字大小不一,不在同一水平线, 不同字渲染成同一个字, 或者字体发虚原因:微软雅黑字体对中文字符的渲染支持不好,下面给出系统推荐的语言字体设置表,而且MSFT在内置的位图映射表中对东亚字符进行了优化。LanguageFontTraditional ChineseMingLiuSimplified Chinese原创 2015-07-07 22:46:53 · 3689 阅读 · 2 评论 -
WPF中PreviewMouseDownEvent的系统处理:TabItem的PreviewMouseDown 事件弹框后不切换的问题调查
背景:UI中有一个TabControl, 包含2个TabItem,当切换到别的TabItem时可能弹框然后根据逻辑判断是否跳转过去。然后我就做了这样一个demo:xaml:UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.mic原创 2015-07-07 22:44:10 · 3990 阅读 · 0 评论 -
KB2464222导致IsNonIdempotentProperty方法找不见
原因:因为打了kb246422补丁后,导致 windowsbase.dll和PresentationFramework.dll 版本不一致, 然后崩溃。解决办法:调查后发现 .Net 4.0其实有3 个大的Update, 分别为:.Net4.0.1, .Net 4.0.2 , .Net4.0.3。根据 kb描述,可知.net 4.0.3 这个累计 Update可以升级windowsBase 等原创 2015-07-07 22:39:15 · 1736 阅读 · 0 评论 -
WPF毫秒级桌面时钟的实现-C#中Hook(钩子)的应用
最近由于项目中需要精确记录某些操作的发生时间,但又没有办法打日志,因此写了个小工具,用来记录当前的毫秒级本机时间。(程序内部实现了全局钩子,监听所有的键盘事件,即KeyDown,KeyUp事件。)工具功能如下:1.通过任意键盘按键来记录当前时间2.可以在列表处单击记录当前时间C#中对于Hook API的包装如下:using System;using System.Collections.Gener原创 2015-01-23 16:22:20 · 4086 阅读 · 0 评论 -
WPF中ItemsControl应用虚拟化时找到子元素的方法
wpf的虚拟化技术会使UI的控件只初始化看的到的子元素, 而不是所有子元素都被初始化,这样会提高UI性能。但是我们经常会遇到一个问题:应用虚拟化后看不见的子元素因为没有实际产生导致ItemContainerGenerator的查找元素方法(ContainerFromIndex / ContainerFromItem)失效。解决办法1:(1)监听ItemsControl的ItemContainerG原创 2014-12-25 09:06:40 · 8970 阅读 · 3 评论 -
WPF错误:必须使“Property”具有非 null 值。
这个问题一般出现在Triggers中Property指定的类型为Nullable。解决办法就是用DataTrigger代替Trigger, 然后用Binding+Converter转换为具体非Null值。比如:原创 2014-10-09 14:28:09 · 4285 阅读 · 0 评论 -
WPF中的CheckBox的_ (underscore / 下划线)丢失
今天在项目中遇到check box的Content的内容缺少'_', 原因是WPF的ContentPresenter默认会把‘_’作为加速键的转义字符。 比如CheckBox的content为“_IsEnable”, 实际结果:显示为“IsEnable”; 当你按键“i”时,会触发Click事件,就可以快速的选中或者取消选中。如果想要显示‘_’, 可以将控件内部的ContentPresenter的原创 2014-09-04 13:29:18 · 3438 阅读 · 0 评论