
wpf
xinyue_htx
自建博客https://xinyuehtx.github.io/
展开
-
如何使WPF在窗口外部区域可拖动缩放
今天来和大家聊如何使WPF在窗口外部区域可拖动缩放。问题来源对于WPF窗口来说,默认的可拖动缩放区域较小。在某些应用场景下我们期望能够设置一个较大的可拖动的缩放区域。自定义WindowChrome有同学马上想到了,通过WindowChrome的ResizeBorderThickness属性进行设置比如下面的方式<Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2原创 2020-05-22 19:44:07 · 1011 阅读 · 3 评论 -
如何在CefShape中禁用右键菜单
今天遇到了一个在cefsharp中禁用浏览器默认右键菜单的需求,mark一下。问题描述当我们使用默认的cefsharp的ChromiumWebBrowser时,会默认添加一个右键菜单项,如下。实际上,我们业务上往往不需要嵌入浏览器中包含这种右键菜单。或者我们期望自己实现业务需求的右键菜单。那应该怎么办呢?解决方法实际上我们ChromiumWebBrowser暴露了一个MenuHadler属性。这个是一个IContextMenuHandler接口对象。我们可以通过自己实现这个接口,进行注原创 2020-05-15 20:12:16 · 1150 阅读 · 0 评论 -
WPF的RadioButton指定groupname在window关闭后无法check
今天遇到一个神奇的WPF的RadioButton的group问题,和大家介绍下。问题描述英文好的同学可以直接看吕毅 - walterlv同学在github提的issue。最小复现demo,见毅仔的仓库我将一组RadioButton关联到了同一个GroupName下,并且绑定了同一个ViewModel。 <Border> <RadioButton GroupName="A" IsChecked="{Binding Bar, Source={x原创 2020-05-14 17:25:45 · 604 阅读 · 0 评论 -
如何正确的在tooltip中实现绑定
小伙伴们肯定都很熟悉xaml的binding,但是对于tooltip或者popup这些跨窗口的binding总是容易遇到这样,或者那样的问题。这里就给大家提供下关于tooltip的binding方法。我们都知道常见的绑定数据源来自以下几种:DataContextElementNameReferenceSource但是对于ToolTip来说这边就不好直接使用了例如下面的代码使用了E...原创 2020-02-27 09:22:38 · 3019 阅读 · 0 评论 -
WPF文本(2)-当显示文本时我们到底在做什么(2)
上一讲我们介绍了如何获取文本字符,这一讲介绍文本的布局我们之前在WPF文本(1)-当显示文本时我们到底在做什么(1)_wpf,c#_黄腾霄的博客-优快云博客介绍过,文本渲染需要经历找字符、measure、arrange、render过程。这里我们统一介绍measure和arrange过程(Layout过程)Layout首先我们思考下一群文本字符应该怎么对齐呢?上对齐?下对齐?并不是,这...原创 2020-02-20 09:58:18 · 200 阅读 · 1 评论 -
为什么WPF在code behind使用RelativeSource的binding会出现错误
不知道是不是有小伙伴遇到过这样的情况。当我们尝试将一个RelativeSource从xaml转到code behind时,原本好好的binding表达式居然出现binding错误。我们来做个实验,我们创建了一个UserControl里面有一个TextBlock,其Text属性绑定了类型为Window的父元素的Title。而我们的window里面的title写了"黄腾霄瘦瘦瘦"这个美好的祝愿。(...原创 2020-02-20 09:51:43 · 458 阅读 · 0 评论 -
task.yield的使用场景研究
出让执行权:Task.Yield, Dispatcher.Yield - walterlv,毅仔的博客珠玉在前。同学们可以直接跳转过去看。比较遗憾的是我没有在里面找到Task.Yield的合适的应用场景。关于Task.Yield的应用场景也是争论纷纷,可见这个东西必然很鸡肋。本文尝试了Task.Yield的几种使用场景,看看是否能够将代码变得更加优雅。坐在MVP旁边狗尾续貂,诚惶诚恐。。R...原创 2020-02-16 09:27:51 · 894 阅读 · 0 评论 -
WPF多线程UI的问题
我们都知道我们都知道WPF是一个单UI线程的应用模型但是实际上我们可以通过在后台线程跑一个Dispatcher来运行UI元素详情可以参见这个大大的博客Launching a WPF Window in a Separate Thread, Part 1 : Reed Copsey, Jr.这种场景用来加载一个欢迎界面还是很nice的但是显然WPF的团队没有充分考虑过这种场景,因为我们遇到...原创 2020-02-06 10:25:19 · 1126 阅读 · 0 评论 -
如何避免写出await await
小伙伴们应该对C#中的await/async模式都很熟悉了,对于一个Task或者Task<T>对象,使用await进行异步任务的等待那么对于一些方法的返回值是Task类型的异步方法呢?比如说 private Task<int> Foo() { return Task.Run(() => 1); ...原创 2020-02-04 08:37:35 · 227 阅读 · 0 评论 -
区分CancellationToken-CancellationTokenSource-CancellationTokenRegistration
发现一些小伙伴的代码中CancellationToken-CancellationTokenSource-CancellationTokenRegistration傻傻分不清楚,今天就对这三个类的使用进行下区分。var source = new CancellationTokenSource();DoAsync(source);... public async void Do...原创 2020-02-04 08:35:14 · 816 阅读 · 0 评论 -
警惕WPF事件引发DispatcherObject跨线程访问
最近发现C#的事件和wpf的dispatcherobject在一起使用会有一些不容易发觉的问题。我们都知道C#的事件原理,实际上是存储了一系列方法的委托。当事件引发的时候,依次调用(Invoke)委托列表的委托进行执行。所以从中可以发现显而易见的一些问题比如:监听事件执行顺序无法保证耗时委托执行拖慢其他业务注册的方法资源泄露问题这些很多人都会聊,我们就不讲了~今天重点讲wpf会...原创 2020-02-04 08:33:33 · 376 阅读 · 0 评论 -
什么是window的VirtualScreen
桌面应用常常会遇到多显示器适配问题,比如我们会期望让小人从最左边的屏幕跑到最右边,或者将一个窗口藏在所有显示器的显示区域之外。在wpf中,我们我们有一个类叫做SystemParameters, 他提供了一些列系统相关的参数属性。我们在这里需要注意的是两个系列PrimaryScreen系列:包括PrimaryScreenHeight,PrimaryScreenWidthVirtua...原创 2020-02-03 15:25:19 · 1324 阅读 · 0 评论 -
为什么不推荐使用Dispather.CurrentDispatcher
对于WPF程序,大家绕不开的一个概念叫做Dispatcher什么是DispathcerWPF程序启动后会有两个线程:UI线程和渲染线程。UI线程会将所有的任务切成小份,放入一个队列进行依次执行,而执行这些工作的object就是Dispatcher。对于WPF来说,常见的Dispatcher概念有三个Application.Current.Dispatcher,Dispather.Curr...原创 2020-02-03 15:17:30 · 1460 阅读 · 0 评论 -
WPF的只读依赖属性
依赖属性的概念大家应该都很清楚,那么什么是只读依赖属性呢?为何要用只读依赖属性当某些时候,你的依赖属性只是为了表征一种多因素影响的复合状态。这种状态不适合由外部显示设置。比如常见的IsMouseOver,当且仅当这个属性由鼠标输入设备进行内部赋值时,结果才是有效的。而在于外部进行赋值时,其值和相应的真实设备状态是不一致的。只读依赖属性的局限由于不可设置,只读依赖属性会被限制众多解决...原创 2020-02-02 15:41:50 · 1160 阅读 · 0 评论 -
如何让WPF显示WebP的图片
人家都已经用上各种自定义的图片格式了,你还在苦苦守候bmp,jpg,png,只是因为想能在wpf中使用?实际上wpf的imaging模块设计的一个初衷就是解决GDI绘图api中缺少良好编解码器扩展的缺陷。所以wpf的图片格式不仅仅支持扩展,而且是易于扩展。WPF的图片的编解码功能来自于wic框架。WIC实际上是一种windows图片处理的API协定,所有实现了WIC接口的编解码器,能够同wi...原创 2020-02-01 21:55:05 · 2579 阅读 · 1 评论 -
WPF程序在shutdown期间引发的TaskCanceledException
先上堆栈TaskCanceledException at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime....原创 2020-01-20 08:52:54 · 1039 阅读 · 0 评论 -
为什么同样的WPF控件在不同的电脑上呈现外观不一致
今天有同事跑过来说遇到了一个奇怪的bug,同样的程序在win7和win10上界面相差了2个像素一开始我们以为是半像素或者是分辨率的问题。结果调试了很久都没有结果。不过意外的我们发现了另一个奇妙的东西。下面两个图分别是在win7和win10情况下soonp获得的可视化树(已用demo替换)有么有发现TabControl的子元素Grid多出了一个名字templateRoot。在代码里...原创 2020-01-19 08:15:07 · 1229 阅读 · 0 评论 -
默认的WPF样式在哪里
我们使用WPF的控件时,.NET framework会为我们提供一些默认的样式一开始我们会认为这个是依赖属性的默认值。但是实际上并非如此我们可以通过以下方法看下默认Button的Template属性Control.TemplateProperty.GetMetadata(typeof(Button)).DefaultValue我们神奇的发现,返回值是null那么不是依赖属性的默认值就...原创 2020-01-19 08:10:34 · 959 阅读 · 0 评论 -
theme主题的原理
在反编译WPF程序集的时候经常会发现一个命名为theme的文件夹这个文件夹中存放着一个预编译的资源字典,如图这个实际上是wpf的一个冷门功能:windows主题支持。你可能没有听说过这个功能,但是如果你像我一样是接触过xp的上个世纪过来的人,就会记得windows的不同主题能够影响元素外观。其实这个功能在WPF 也有保留,只是大家定制的样式多了,没有注意到罢了参见为什么同样的WPF控...原创 2020-01-18 09:00:39 · 597 阅读 · 0 评论 -
RenderTransformOrigin和RotateAt一起作用会怎样
我们都知道RotateTransform会受到旋转中心RenderTransformOrigin的影响因此我们如果期望在中点旋转,我们可以选择设置RenderTransformOrigin=0.5,0.5 <Rectangle Width="100" Height="100" Fill="Teal" RenderTransformOrigin="0.5,0.5">...原创 2020-01-17 08:45:47 · 635 阅读 · 0 评论 -
如何将文字转换为对应的PathGeometry
有些时候你期望用Path画出一些文本的形状比如说你会期望做出如下效果什么让UI给个图?恩,有道理,可惜我不是UI,我不会咋办呢?其实我们可以使用FormattedText的BuildGeometry将字符串转成对应的Geometry首先我们要构造一个FormattedText对象例子中的参数分别为:要渲染的字符串,CultureInfo,文字布局方向,字体信息,字号,Brush,...原创 2020-01-16 08:46:59 · 1303 阅读 · 2 评论 -
EventTrigger原理浅谈
EventTrigger原理浅谈EventTrigger相信大家都会写,就和下面的东西一样样的。<EventTrigger RoutedEvent="Mouse.MouseEnter"> <EventTrigger.Actions> <BeginStoryboard> ...原创 2020-01-06 20:54:58 · 1458 阅读 · 0 评论