0%

几星期前就看到有个朋友建了一个 Ghost 1.0.0 beta 的站,Casper 主题也更新到了 2.0 版,变化还是很大的,取消了第一屏的设计,首页从列表换成了瀑布流,文章页的布局和排版也有了很多处的调整,更加有了作为一个博客的风格文艺范,今天看到正式版发布了,打算升级一下,却不料诸事不顺。。。

Read more »

在一个项目里用到了类似 “吸附式窗口” 的东西,就是子窗体附着在父窗体周围并跟随父窗体移动。有个用户反应在 Show 了子窗体之后,移动父窗体会有明显的延迟和闪烁感觉。

该问题发生时 UI 线程的 GetMessageW 方法 CPU 占用率极高,起初估计是 UI 线程无法及时处理消息,但是后来发现如果不设置窗体的 Top 属性则不会发生闪烁,于是怀疑是 WPF 的依赖属性造成的性能下降,考虑直接使用 WinAPI 来改变窗体位置。之后尝试了几种方法,MoveWindowSetWindowPos、父窗体捕获 WM_SIZE 消息、父窗体向子窗体发送 WM_SIZE 消息,卡顿确实有很大程度上的缓解,但是闪烁问题依然存在。

Read more »

WPF 中内置实现的虚拟化容器只有 VirtualizingStackPanel 这一个,而为了应对实际应用中的各种自定义(组合)控件,我们需要自己去实现容器应该完成的功能,若想做到这一点,不仅仅需要继承 VirtualizingPanel,还需要实现 IScrollInfo 接口。
一般来说,我们很少会去实现 IScrollInfo 这个接口,因为这个接口实在是过于繁重,定义了多达 15 个方法和 9 个属性!但是为了能够正确地在 ScrollViewer 中处理各种情况,实现这个接口是必须的。

Read more »

在 WPF 中,为了自己实现无边框窗口,需要使用 WindowChrome 来实现,但是,这会导致当窗口全屏时,如果任务栏是自动隐藏的,则当窗口被激活时,无法触发显示任务栏。为了解决这个问题,可以把距离任务栏最近的一个方向减少 1px,这样一来任务栏就不会被遮挡。
但是这个方法并不是足够完美,Office 全家桶和 Visual Studio 就没有使用这种方式。

Read more »