In December 2019 I finished porting the Peakboard runtime, the part that puts a board on a screen, from UWP to WPF on .NET Framework 4.6.2. The board files did not change. What changed is that the runtime now lives on the same platform as the designer, and stops fighting a sandbox that was never meant for it.
UWP was a reasonable bet when Peakboard started. It gave us a kiosk-style app, a clean lifecycle and a straight path onto Windows tablets. The trouble is what a board on a shop floor actually asks for: a file on a network share, a font the customer already uses in every other document, a printer, a driver, a library that was written for the full framework and will never be ported. Every one of those is a small negotiation with the sandbox, and some of them you simply lose.
WPF has none of those limits, and it has a second advantage that is easy to underrate. The designer is a WPF application. Once the runtime is one too, both sides can draw a control with the same code instead of two implementations that drift apart. What you place in the designer is what you get on the screen, and that stops being a claim you have to keep re-checking.
The port itself was not the interesting part. The interesting part came afterwards. Images and custom fonts leaked memory, quietly, over the days and weeks a board runs without anybody restarting it. Bitmaps created from a URI held a file lock on the resource, so the file could not be replaced while the board was showing it. Both took longer to find than to fix, and both only show up when something runs for a week rather than for a demo. The resource handling ended up rewritten around the package rather than around the file.
A few things came along for free. The runtime can start without the local webserver. It can take a screenshot of what is currently on the screen. Exceptions show up in the log view with context instead of as a line you have to guess at. And the retro flipper control, which is pure rendering, was easier to port than to keep in two versions.
The UWP runtime stayed in the build for another year, because you do not turn off the thing customers are running until the replacement has been out in the field long enough. It came out at the end of 2020.
That’s it.
If you have questions feel free to contact me.