En mi anterior post comentaba que los menús de aplicaciones escritas para Smartphone con la .NET Compact Framework tienen una serie de limitaciones entre las cuales se incluye la de que es "imposible" ocultarlos.

Tal y como mencioné entonces, Microsoft recomienda deshabilitarlos y quitarles el texto. En este post precedente hice un ejemplo con una clase nueva para menús ocultables que seguía la recomendación de Microsoft. El resultado es bastante feo como se veía en las figuras y, la verdad, a mi no me convence en absoluto.

Así, me planteé como tarea de entretenimiento para cuando tuviese un rato libre el crear un nuevo tipo de menú que sea ocultable de verdad.

La primera idea que tuve fue recurrir a la API del sistema con Interop y utilizar algunas funciones nativas de manejo de menús pero se convierte en un lío demasiado gordo porque la clase MenuItem ni siquiera ofrece forma directa de averiguar el manejador del menú que gestiona.

La idea que he seguido al final es mucho más sencilla, aunque como verás en el código también tiene su complicación.
La figura del lateral muestra el aspecto de un menú antes de ocultar uno de sus elementos.
La siguiente figura muestra el resultado obtenido al ocultar el segundo menú, que es el que cabría esperar de una propiedad Visible (que es la que he añadido):

Lo que he hecho es manipular la colección MenuItems del padre del menú a ocultar. Por ejemplo, ocultarlo es muy sencillo ya que lo que hago en realidad es quitarlo directamente:

this.Parent.MenuItems.Remove(this);

La complicación viene a la hora de hacerlo visible ya que hay que volver a colocarlo en el mismo lugar. Para ello almaceno en variables privadas de la clase MenuOcultable una referencia al padre y la antigua posición. Al colocarlo de nuevo hay que ponerlo al final con el método Add, y mover los que le preceden al final también ya que este método sólo permite colocar menús al final (como el Push de una pila). Además hay que tener en cuenta que no se pueden quitar todos los elementos o se gebera un error.

En fin, lo mejor es que descargues el ejemplo y el código y lo veas tú mismo.

La clase funciona con cualquier menú en cualquier posición y con sub-menús o sin ellos. La única limitación que tiene (aparte del hecho de no poder usar el diseñador, que por otra parte es poco útil), es que no se puede ocultar un menú si es el único que queda. En este caso si lo hacemos se genera una excepción del tipo NotSupportedException. Esto es una limitación de la plataforma.

Pienso que es fácil de superar clonando al padre del menú único, y poniendo la copia (que ya no tiene hijos) en lugar del original. Luego habría que restaurar el anterior. De todos modos no lo he implementado porque tampoco me parece tan importante y me ha dado pereza. Si alguien completa mi código con esto, por favor, que me escriba para mandármelo. ;-))

Escrito por un humano, no por una IA