Una de las limitaciones del .NET Compact Framework es que, al contrario que el Framework completo, no dispone de un panel con barras de desplazamiento. El único control que se le parece es el Panel (así, a secas), que consiste en un contenedor de tamaño variable en el que se pueden insertar tantos widgets como se desee, en las coordenadas que se quiera.
Sin embargo, para el trabajo que estoy haciendo necesitaba un panel con barras desplazables, así que busqué en la red y encontré un truco: hacer un panel del tamaño que se necesite, colocar dentro los elementos deseados, añadir dos barras de desplazamiento fuera del panel y hacer que éstas cambien las coordenadas X e Y de éste, de manera que se mueva por toda la pantalla. Esta solución es aceptable cuando sólo se desea un único panel que ocupe toda la pantalla, pero en mi caso no servía porque yo necesitaba poder colocar más elementos fijos, con lo que el panel sólo ocuparía una parte.
La solución, un tanto enrevesada, consiste en crear una nueva clase que contenga dos widgets Panel, uno dentro del otro: el externo, que definirá la zona de visión y será del tamaño que desee que se muestre en pantalla, y el interno, que será más grande y contendrá todos los widgets que necesitemos. Para conseguir el desplazamiento basta con añadir barras de desplazamiento.
En mi caso sólo necesitaba desplazamiento vertical, así que añadí una sola a la derecha. El evento scrolled ajusta la propiedad Top del panel interno, usando el negativo de su valor (al aumentar el valor de la barra hay que desplazar el panel negativamente). El parámetro Maximum de la barra toma el valor de la altura del panel interno menos uno, y el parámetro LargeChange la altura del panel externo. De esta manera el tamaño de la barra se ajusta automáticamente a la relación de tamaños de ambos paneles.
El código de ejemplo del panel desplazable se puede bajar aquí.
Panel desplazable por A cuadros está licenciado bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.