User Interface Taking Control
Once I finally figured out that keyboard events require objects derived from UWP's Control
class, the rest was pretty easy. UWP has a large library of common controls to draw from, but none really fit what I'm trying to present to the user.
What came closest is a ScrollViewer
, designed to present information that does not fit on screen and allows the user to scroll around the full extents much as my camera on a 3D printer carriage can move around the XY extents of the 3D printer. However, the rendering mechanism is different. ScrollViewer
is designed to let me drop a large piece of content (example: a very large or high resolution image) into the application and let ScrollViewer
handle the rest independently. But that's not what I have here - in order for scrolling to be mirrored to physical motion of 3D printer carriage, I need to be involved in the process.
Lacking a suitable fit in the list of stock controls, I proceeded to build a simple custom control (based on the UserControl
class) that is a composite of other existing elements, starting with the CaptureElement
displaying the webcam preview. And unlike on CaptureElement
, the OnKeyDown
and OnKeyUp
event handlers do get called when defined on a UserControl
. We are in business!
Once called, I have the option to handle it, in this case translating directional desire into G-code to be sent to the 3D printer. My code behavior fits under the umbrella of "inner navigation", where a control can take over keyboard navigation semantics inside its scope.
I also have the ability to define special keys inside my scope, called accelerators ([Control] + [some key]) or access ([Alt] + [some key]) keys. I won't worry about it for this first pass, but they can be very powerful when well designed and a huge productivity booster for power users. They also have a big role in making an application keyboard accessible. Again while it is a very important topic for retail software, it's one of the details I can afford to push aside for a quick prototype. But it'll be interesting to dive in sometime in the future, it's a whole topic in and of itself. There's literally a book on it!
In the meantime, I have a custom UserControl
and I want to draw some of my own graphics on screen.