With the Compact Framework making programming for devices so easy, there is an increasing number of desktop developers making the move to CF development (or at least getting their feet wet). They face the challenges of a .NET Framework that is missing whole areas (e.g. Remoting, COM Interop, ASP.NET) and has every interface trimmed down (e.g. the Thread has only 2 public instance members) - it is not called the
*Compact* Framework for nothing. Many of my blog entries focus on exactly that: the differences between the full and compact frameworks and sometimes how to bridge the gap.
However, another difference is the actual operating system or platform. This bites the developer even more if they are not daily users of a Pocket PC (which is the target of 95% of the NETCF developers). The situation described has as a consequence a lot of questions in the CF newsgroup, so I will try to address some of these in this entry and point to it in the future (as an FAQ).
1. Input methodsPPCs do not have a mouse or a keyboard (for the few devices that have, keyboard events are supported by some NETCF controls since
Service Pack 2). The lack of a mouse is catered by a touch screen and the use of a stylus (mouse events are not supported in most controls and you may need to create your own control; help for custom controls is
here,
here and
here). Right-click context menus are simulated by tap-and-hold (made possible by the aygshell.dll that is part of the PPC platform). There is a Soft Input Panel (SIP), which is a software keyboard that can pop up on the screen. To interact with it, you must reference
Microsoft.WindowsCE.Forms.dll
and drag the
InputPanel
control onto your form. To show it, you call
InputPanel1.Enabled = true
, typically in the
GotFocus
event of a TextBox (and set it to false in the
LostFocus
). To detect when it is up or down, you can track the
InputPanel.EnabledChanged
event. Note that hand-in-hand with the InputPanel is the
MainMenu
control that your form must have - even if it doesn't use it (!)
2. Form/Dialog sizeForms and dialogs on the PPC are always full screen (the only exception to that rule is the built-in MessageBox). There are
known workarounds, but it seems that they hurt more than they help, so my advice is to stick with full screen dialogs and design for that approach from day 1. Try to design the UI so the user never gets the impression they are interacting with more than one screen; use multiple hidden panels on one form and swap them in/out as appropriate.
3. App/Form closingThe design guidelines for the PPC are clear: Applications do not exit/close, instead they minimise. This aids in the concept of a device that is always on (and the apps are always available, without waiting for them to load each time). For NETCF apps, setting the
Form1.MinimizeBox
to true will display the X button in the top right, whereas
MinimizeBox=false
will instead show a little OK button in the top right. Clicking an X minimizes the form, whereas clicking an OK closes the form and by extension the application if the form is the application's main form. Note that minimising is not identical to the desktop, i.e. all that happens to the window is that it is pushed to the back of the stack of open windows on the PPC. To programmatically know when a smart minimize occurs, you should hook into the
Form1.Deactivate
event (which is supported even though designer support is missing).
4. Moving between applicationsFollowing from points 2 & 3 above, you might wonder how you switch between applications. There are various ways: By closing (minimising really) windows, you can reach the desired one OR you can use the top-right Start menu (Windows icon) OR open the
Start->Settings->System->Memory->Running Programs
screen. The "Running Programs List" displays all the open windows (minimised or not) and allows you to switch between them. This presents a problem in a scenario where your app has
Form_A
opening
Form_B
and you only expect the user to get back to
Form_A
after closing
Form_B
; they can also go to
Form_A
by using the "Running Programs List"! The
workaround is to only show in the list the active form and to do that you must set the caption (
Form1.Text
) of other forms to
String.Empty
(""). By the way, if you are having trouble bringing your application to the front programmatically,
read that.
In my opinion, these are the top 4 gotchas for desktop devs moving to the PPC platform. Look forward to the next 4 or 5 in
part B.