Archivo de la etiqueta: maui

Errores de iOS con .NET MAUI

Pues eso… todo iba bien con las aplicaciones de .NET MAUI para iOS (después de muchos quebraderos de cabeza) y ahora, de buenas a primeras, empezó a pasar después de actualizar Visual Studio 2022 de la versión 17.3.5 a la 17.3.6.

Nota del 16-oct-22:

Solución a medias (que al menos me sirve para seguir probando las aplicaciones de .NET MAUI en iOS).

He usado el proyecto en otro equipo (un laptop/portátil) con Visual Studio 2022 Preview y ahí sí que ha funcionado todo.
Así de simple.
No es mi equipo habitual, y las copias que tengo no incluyen los ficheros de github, pero al menos me ha permitido seguir probando cosas.

Un consuelo como otro cualquiera. 😉

El error que me ha dado es este:

Error: CS1705 Assembly ‘Microsoft.Maui’ with identity ‘Microsoft.Maui, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’ uses ‘Microsoft.iOS, Version=16.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065’ which has a higher version than referenced assembly ‘Microsoft.iOS’ with identity ‘Microsoft.iOS, Version=15.4.300.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065’

He reportado el error, ya que lo que encontré no me solucionaba el problema.

Lo último que hice fue desinstalar totalmente el Visual Studio 2022 y después volver a instalarlo, antes hice un Rollback a la versión anterior, y probé con prácticamente todas las opciones de dotnet workload, pero sin ningún resultado favorable.

En el bug que reporté me decían que estaba duplicado y ahí he leído que aparte de desinstalar el Visual Studio, hay que desinstalar el SDK de .NET 6, esto último no lo he hecho pensando que se instalaba con el propio Visual Studio, lo mismo que el SDK de .NET 7 se instala con el Visual Studio 2022 Preview (que ya antes lo tuve que desinstalar para que las apps de .NET MAUI funcionaran sin darme error de que faltaban workloads.

Bueno, pues voy a ver si puedo desinstalar el .NET SDK aunque tenga que volver a instalar el Visual Studio al completo… 🙄

Ya te iré contando. 🤞🏻🙏🏻🤔

Pasos seguidos

Paso 1: Desinstalar el .NET SDK 6.0.305

Figura 1. Desinstalar el .NET SDK 6.0.305

Paso 2: Desinstalar el .NET SDK 6.0.402

Figura 2. Al desinstalar el .NET SDK 6.0.305 dice que nones

Como ves en la figura 2, al querer desinstalar el .NET SDK 6.0.402 me dice que no, que lo ha instalado el Visual Studio.

Después del paso 2, la cosa sigue igual.

Paso 3: Desinstalo los SDK de MAUI y .NET 6 desde el instalador de Visual Studio

Figura 3. Desinstalo desde el instalador de VS los SDK de MAUI y los de Android, iOS y normal

Ahora se supone que no podré crear nada… salvo la app de Windows.
A ver qué pasa…🤞🏻

Estos son los errores que me da el Visual Studio al no tener los SDK (figura 4), ni la app de Windows funciona (normal, no hay ningún SDK válido).

Figura 4. Los errores de Visual Studio al no tener los SDK.

Ahora probaré a volver a instalarlos. Aunque antes voy a reiniciar el equipo.

Paso 4: Después de reiniciar el equipo, quito todo del instalador de Visual Studio

Y ahora iré añadiendo los workloads y demás…

Figura 5. Quito todo y ahora a indicar lo que se debe instalar

Paso 5: Selecciono los Workloads en el instalador de Visual Studio

Figura 6. Selecciono los Workloads en el instalador de Visual Studio

Y compruebo que los SDK estén (figura 7)

Figura 7. Los componentes individuales al configurar los workloads

A ver qué pasa después de instalar… 🤞🏻🤔

Conclusión de estos 6 pasos

¡No hay que rascar! todo sigue igual de mal (con la app para iOS).
Las aplicaciones de Windows y Android van bien.

Ahora me toca quitar el SDK de iOS a ver qué pasa… Ya no sé si cruzar los dedos o levantar uno… 🤔🙄☝🏻 (pero no el central que no es plan, jajaja)

Paso 7: Quito el SDK de iOS

Con esto tampoco funcionará, pero a ver si lo puedo instalar usando dotnet workload.

Figura 8. Quito el SDK de iOS

Esto es lo que muestra dotnet --info antes de hacer nada.

E:\gsCodigo_00\Visual Studio\pruebas\MAUI\Trucos_MAUI>dotnet --info
.NET SDK (reflecting any global.json):
 Version:   6.0.402
 Commit:    6862418796

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.22000
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\6.0.402\

global.json file:
  E:\gsCodigo_00\Visual Studio\pruebas\MAUI\Trucos_MAUI\global.json

Host:
  Version:      6.0.10
  Architecture: x64
  Commit:       5a400c212a

.NET SDKs installed:
  3.1.424 [C:\Program Files\dotnet\sdk]
  5.0.303 [C:\Program Files\dotnet\sdk]
  5.0.406 [C:\Program Files\dotnet\sdk]
  5.0.408 [C:\Program Files\dotnet\sdk]
  5.0.413 [C:\Program Files\dotnet\sdk]
  6.0.402 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 3.1.18 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.19 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.23 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.28 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.30 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 6.0.10 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.18 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.19 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.23 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.28 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.30 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.10 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.1.18 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.19 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.23 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.28 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.30 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.15 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 6.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 6.0.10 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Download .NET:
  https://aka.ms/dotnet-download

Learn about .NET Runtimes and SDKs:
  https://aka.ms/dotnet/runtimes-sdk-info

Paso 8: Usar dotnet workload restore con uno de los proyectos

Empezaré con el comando dotnet workload restore Trucos_MAUI.sln.
(Por eso estaba posicionado en el directorio con el proyecto de pruebas).

Y dice que:

E:\gsCodigo_00\Visual Studio\pruebas\MAUI\Trucos_MAUI>dotnet workload restore Trucos_MAUI.sln
Installing workloads:

Successfully installed workload(s) maui maui-android maui-ios maui-tizen.

A probar toca…

Ahora en el proyecto no me muestra las opciones de probar ni con iOS ni con Android y el que tiene una advertencia en las dependencias es el net6.0-android. En fin… 🙄

Paso 9: Instalo nuevamente los workloads (y SDKs) para MAUI (que se había desmarcado)

Paso 10: Instalo nuevamente el .NET 6.0 SDK (v6.0.305)

Figura 9. Instalo nuevamente el .NET SDK 6.0.305

Aunque antes voy a probar usando el que tenía antes (con el .NET 6.0.402) por si el instalador de Visual Studio lo ha dejado bien (cosa que dudo, pero… ¡hay que tener fe! 🙏🏻)

Sigue con la misma cantinela.

Paso 11: Cambio en global.json la versión de .NET SDK a la 6.0.305 en vez de la 6.0.402

Intentaré ponerlo para que lo use la solución (del proyecto) con el fichero global.json y este contenido:

{
  "sdk": {
    "version": "6.0.305"
  }
}

A ver qué pasa.

Lo suponía, ese SDK se incluía con el Visual Studio 17.2.9 y no incluye el .NET MAUI (que se incluyó con el Visual Studio 2022 17.3 😒

Por tanto, no se puede hacer nada ni con Windows siquiera… ¡Los milagros en Visual Studio no existen! 🤣

Paso 12: Vuelvo a poner en el global.json el .NET SDK 6.0.402

Y cuando abro el Visual Studio me sale esto:

Figura 10: Encima con cachondeo

Que tome una «survey» de mi experiencia con el desarrollo para iOS… si es que… 🙄

¡Hecho! Aunque, no hay mucho que decir… están más enfocados al emparejamiento con un Mac, que es lo que te permite distribuir las apps de iOS sin necesidad de tener el móvil junto a tu «computadora» para instalar la app.

Pero tampoco funciona… sigue con el mismo error.

Seguimos…

Paso 13: Vuelvo a probar con dotnet workload restore Trucos_MAUI.sln.

Pero nada… sigue igual.

Paso 14: En vista que el .NET SDK 6.0.305 no me vale, lo vuelvo a desinstalar

Y después de desinstalar este SDK que ya no me vale, no sé qué más hacer… 🤷🏻‍♂️

Nota del 13-oct-22 00.08:
Como consuelo me ha quedado que al menos las apps de Xamarin para iOS funcionan desde Visual Studio 2022, ya que en Visual Studio 2019 no pueden firmar la app… cosas que pasan…
Ver esto: Truco 3 de .NET MAUI.

Nos vemos.
Guillermo

Trucos para .NET MAUI (segunda parte)

Pues eso… seguimos con los trucos para .NET MAUI, en la primera parte te mostré cómo configurar el proyecto para usar las plataformas que prefieras y cómo configurar el aprovisionamiento para iOS (necesitas una cuenta de Apple Developer). Ahora vamos a ver algunas cosillas referentes al diseño de la aplicación.

Para poder mostrarte estos trucos, he creado una aplicación para .NET MAUI con Visual Studio 2022 (community), pero no la versión Preview, ya que a la hora de escribir esto, la tengo desinstalada y así uso el .NET 6.0 (que es el que por ahora me está dando menos problemas, al menos teniendo el .NET 6 y el .NET 7 RC1).
La versión de Visual Studio 2022 es:
Microsoft Visual Studio Community 2022 (64-bit) Version 17.3.5

Acabo de instalar la versión 17.3.6 y sigue funcionando bien 😉

Truco 4: Mostrar bien los Frame sin que se corten

Cuando añades un Frame se suelen cortar los bordes (ver la figura 1)

Figura 1. Los frame se cortan las líneas

El código XAML para mostrar esto es el siguiente:

<ScrollView>
    <VerticalStackLayout
        Padding="10,0"
        VerticalOptions="Center">

        <Frame>
            <VerticalStackLayout Spacing="25">
                    <Image
                            Source="dotnet_bot.png"
                            SemanticProperties.Description="Cute dot net bot waving hi to you!"
                            HeightRequest="200"
                            HorizontalOptions="Center" />

                    <Label
                            Text="Hello, World!"
                            SemanticProperties.HeadingLevel="Level1"
                            FontSize="32"
                            HorizontalOptions="Center" />

                    <Label
                            Text="Welcome to .NET Multi-platform App UI"
                            SemanticProperties.HeadingLevel="Level2"
                            SemanticProperties.Description="Welcome to dot net Multi platform App U I"
                            FontSize="18"
                            HorizontalOptions="Center" />

                    <Button
                            x:Name="CounterBtn"
                            Text="Click me"
                            SemanticProperties.Hint="Counts the number of times you click"
                            Clicked="OnCounterClicked"
                            HorizontalOptions="Center" />

            </VerticalStackLayout>
        </Frame>
    </VerticalStackLayout>
</ScrollView>

Lo deseable es que esté como en la figura 2.

Figura 2. Los Frame deben mostrar todos los bordes

El truco consiste en añadir un margen al StackLayout que esté contenido en el Frame.

<Frame>
    <VerticalStackLayout Spacing="25" Margin="4">

¿Fácil verdad?

Nota:
Este fallo solo ocurre en las aplicaciones de Windows (WinUI)

Tal como te acabo de decir, este fallo (de que se corten las líneas del Frame) solo ocurre en las aplicaciones para Windows (WinUI), al menos en iOS y Android no pasa, tal como puedes ver en las capturas 3 y 4.

Figura 3. La app de prueba en un iPhone 7 plus (iOS)
Figura 4. La app funcionando en un Pixel 4a (Android)

En realidad, al menos en iOS y Android, da igual que esté lo de Margin = «4» como que no, el efecto es prácticamente el mismo.

Truco 5: Cambiar el tamaño de la ventana en Windows

Otro de los problemas (al menos con la compilación actual de .NET MAUI) es que la ventana de la aplicación de Windows (WinUI) se muestra prácticamente a pantalla completa, y, ya te digo que al menos por ahora, ese tamaño no es configurable de forma automática o, que ocurra como en las aplicaciones para Xamarin en la que el usuario es el que decide qué tamaño y posición debe tener la ventana, de forma que en las próximas veces que se abra la aplicación se muestre como se dejó la última vez.

Nota:
En esta «issue de MAUI» dicen que se podrá hacer: Desktop: set window size and position #771 (pero ni idea de cómo o cuando estará disponible).

Lo que yo hago en estos casos es usar un tamaño «fijo» (que no es lo suyo, pero…) y asignarlo de esta forma en el constructor de la clase App.

public App()
    {
         InitializeComponent();

        // Indicar el tamaño para la app de Windows.
        Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), (handler, view) =>
        {
#if WINDOWS

                // Asignar manualmente el tamaño. 
                int winWidth = 1000;
                int winHeight = 900;

                var mauiWindow = handler.VirtualView;
                var nativeWindow = handler.PlatformView;
                nativeWindow.Activate();
                IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(nativeWindow);
                var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
                var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
                appWindow.Resize(new Windows.Graphics.SizeInt32(winWidth, winHeight));

#endif
        });

        MainPage = new AppShell();
    }

Truco 6: Mostrar el título en la barra de la ventana (con colores personalizados)

Otra cosa que estoy haciendo desde hoy (al probar en la aplicación gsCrearTablas_MAUI) es posicionando la ventana y de paso cambiando el color a la barra de título (para que no se vea el color ese tan feo) y también mostrando el título en esa barra de la ventana.

Como puedes ver en la figura 2, no se muestra de color «normal» la barra de título y tampoco tiene un texto.

En la captura 5 puedes ver el color y el texto en la barra de título que podrás conseguir con el código que te muestro a continuación (después de la captura).

Figura 5. La app de Windows con texto y color en la barra de título

La asignación del color y texto de la ventana lo conseguimos haciendo esta asignación (en el código mostrado antes) lo tendrías que poner al final, después de appWindow.Resize.

// El título hay que asignarlo antes de asignar los colores.
appWindow.Title = "Trucos MAUI by elGuille";
// Este es el color que tiene en mi equipo la barra de título.
appWindow.TitleBar.BackgroundColor = Microsoft.UI.ColorHelper.FromArgb(255, 0, 120, 212);
appWindow.TitleBar.ForegroundColor = Microsoft.UI.Colors.White;

Para poder posicionarla, hace falta un truquillo más que es que la ventana se haya mostrado, ya que, si queremos acceder al tamaño de la pantalla, nos dará un valor nulo (o cero).

Nota:
El color que asigno a la propiedad BackgroundColor lo he sacado de cómo se muestra el color en mi equipo, por tanto, en tu caso, lo mismo lo tienes que cambiar: FromArgb(255, 0, 120, 212).

Truco 7: Esperar a que la ventana está mostrada para manipular la posición

Esto lo pones también en el primer código que te mostré en el truco 5, después de appWindow.Resize. Fíjate que el cambio del color y el título hay que hacerlo dentro del Dispatcher.Dispatch, si no, el título no se muestra.

// get screen size
DisplayInfo disp = DeviceDisplay.Current.MainDisplayInfo;
double x, y;

// dispatcher is used to give the window time to actually resize
Dispatcher.Dispatch(() =>
{
    disp = DeviceDisplay.Current.MainDisplayInfo;
    x = (disp.Width / disp.Density - winWidth) / 2;
    if (x < 0) 
    {
        x = 0;
    }
    y = (disp.Height / disp.Density - winHeight) / 2;
    if (y < 0)
    {
        y = 0;
    }
    appWindow.Move(new Windows.Graphics.PointInt32((int)x, (int)y));

    // Si cambiamos la posición, esto hay que hacerlo en el Dispatcher.Dispatch
    // El título hay que asignarlo antes de asignar los colores.
    appWindow.Title = "Trucos MAUI by elGuille";
    // Este es el color que tiene en mi equipo la barra de título.
    appWindow.TitleBar.BackgroundColor = Microsoft.UI.ColorHelper.FromArgb(255, 0, 120, 212);
    appWindow.TitleBar.ForegroundColor = Microsoft.UI.Colors.White;

Y con esto lo dejo por hoy… voy a seguir investigando (y probando) para poder ponerte algunos trucos más.

El código coloreado usando el condicional de WINDOWS (#if WINDOWS)

Pues eso, que habitualmente se muestra con el color grisáceo ese que te he mostrado antes cuando usas el condicional de compilación para Windows (#if WINDOWS) y, algunas veces, no sé cómo, sale coloreado (que es como debería salir).

Este código es de otra aplicación pero intentaré usar los mismos valores que en este proyecto de pruebas.

            // Indicar el tamaño para la app de Windows.
            Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), (handler, view) =>
            {
#if WINDOWS

                // Asignar manualmente el tamaño. 
                int winWidth = 800; // 1700; // 2800;
                int winHeight = 640; //1800

                var mauiWindow = handler.VirtualView;
                var nativeWindow = handler.PlatformView;
                nativeWindow.Activate();
                IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(nativeWindow);
                var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
                var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
                //appWindow.Resize(new Windows.Graphics.SizeInt32(winWidth, winHeight));

                // get screen size
                DisplayInfo disp = DeviceDisplay.Current.MainDisplayInfo;
                double x, y;

                // dispatcher is used to give the window time to actually resize
                Dispatcher.Dispatch(() =>
                {
                    disp = DeviceDisplay.Current.MainDisplayInfo;
                    
                    // Si Density es diferente de 1, ajustar el tamaño.
                    if (disp.Density > 1)
                    {
                        winWidth = (int)(winWidth * disp.Density);
                        winHeight = (int)(winHeight * disp.Density);
                    }
                    // El tamaño de la pantalla de este equipo.
                    int screenW = (int)(disp.Width / disp.Density);
                    int screenH = (int)(disp.Height / disp.Density);
                    // Si el alto indicado es mayor, ponerlo para que entre en esta pantalla.
                    if (winHeight > screenH)
                    {
                        winHeight = screenH - 60;
                    }
                    // Si el ancho indicado es mayor, ponerlo para que entre en esta pantalla.
                    if (winWidth > screenW)
                    {
                        winWidth = screenW - 60;
                    }
                    appWindow.Resize(new Windows.Graphics.SizeInt32(winWidth, winHeight));
                    x = (screenW - winWidth) / 2;
                    if (x < 0) 
                    {
                        x = 0;
                    }
                    y = (screenH - winHeight - 40) / 2;
                    if (y < 0)
                    {
                        y = 0;
                    }
                    appWindow.Move(new Windows.Graphics.PointInt32((int)x, (int)y));

                    // El título hay que asignarlo antes de asignar los colores.
                    appWindow.Title = "Trucos MAUI by elGuille";
                    // Este es el color que tiene en mi equipo la barra de título.
                    appWindow.TitleBar.BackgroundColor = Microsoft.UI.ColorHelper.FromArgb(255, 0, 120, 212);
                    appWindow.TitleBar.ForegroundColor = Microsoft.UI.Colors.White;
                });

#endif
            });

Y, ya sabes, si te parece bien, puedes hacer un donativo con PayPal, que es como si me invitaras a un refresco, es decir, no es necesario que me dejes toda tu herencia, solo un par de euritos de nada… 😉

Nos vemos.
Guillermo

P.S.
El repositorio de GitHub ya está creado: Trucos_MAUI.

P.S.2
Por cierto, ahora no me funciona la app para iOS.
El error que da es:

Error CS1705: Assembly ‘Microsoft.Maui’ with identity ‘Microsoft.Maui, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’ uses ‘Microsoft.iOS, Version=16.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065’ which has a higher version than referenced assembly ‘Microsoft.iOS’ with identity ‘Microsoft.iOS, Version=15.4.300.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065’

He buscado (con BING, ya que con Google no encontraba nada al poner esa cadena) para ver de qué va esto y lo que he encontrado (https://github.com/dotnet/maui/issues/8858) dice que ya está resuelto (o algo así) y en teoría la solución que da a mí no me funciona, que si no he entendido mal es dotnet workload install (supongo que indicando o maui o ios) pero nada, también he probado con dotnet workload install ios, con dotnet workload update, con dotnet workload repair y posicionándome en el directorio del proyecto con dotnet workload restore Trucos_MAUI.csproj, pero nada de nada… Ni siquiera usando el peasso de comando este:
dotnet workload install maui --from-rollback-file https://aka.ms/dotnet/maui/6.0.408.json --source https://aka.ms/dotnet6/nuget/index.json --source https://api.nuget.org/v3/index.json
Pero nada de nada… ya, por último, hasta he desinstalado el Visual Studio (en realidad he usado la opción Rollback to previous version) la versión 17.3.6 (a la 17.3.5) pero tampoco ha solucionado nada de nada, así que… he vuelto a instalar la versión 17.3.6, que es la última a día de hoy.
A ver si para la siguiente tanda de trucos tengo la solución. 🤞🏻🙏🏻

P.S.3 (12-oct-22 17.35)
He creado otra entrada (Errores de iOS con .NET MAUI) con el problema este que te comento en el «P.S.2» con idea de ver si lo soluciono.

Trucos para .NET MAUI (primera parte)

Pues eso… aquí te muestro algunos trucos para usar con .NET MAUI para que no pierdas la razón como me está pasando a mí 😉

Para poder mostrarte estos trucos, he creado una aplicación para .NET MAUI con Visual Studio 2022 (community), pero no la versión Preview, ya que a la hora de escribir esto, la tengo desinstalada y así uso el .NET 6.0 (que es el que por ahora me está dando menos problemas, al menos teniendo el .NET 6 y el .NET 7 RC1).
La versión de Visual Studio 2022 es:
Microsoft Visual Studio Community 2022 (64-bit) Version 17.3.5

Acabo de instalar la versión 17.3.6 y sigue funcionando bien 😉

Truco 1: Crear la aplicación de pruebas y hacer que funcione

Lo primero es quitar las advertencias en los paquetes de NuGet (ver figura 1).

Figura 1. Advertencias en las dependencias del proyecto

Esto se soluciona ejecutando la aplicación (en mi caso para Windows).

Truco 2: Quitar los tipos de aplicaciones que no quieras usar

Aunque de paso he quitado el soporte para maccatalyst (ya que no tengo un Mac para poder probarlo). Esto es fácil de hacer, abres el fichero del proyecto (botón secundario sobre el nombre del proyecto, en mi caso Trucos_MAUI) y selecciona Edit Project File (en español será con otro texto: Editar el archivo de proyecto o algo así).

En la parte superior, busca esta línea: <net6.0-android;net6.0-ios;net6.0-maccatalyst> y cámbiala por esta otra: <net6.0-android;net6.0-ios>.

Truco 3: Usar la aplicación para iOS (iPhone, etc.)

Para poder usar la aplicación en iOS debes tener una cuenta en Apple Developer (99€ al año) y configurarlo para que use la versión «individual», es decir, con la definición normal de la cuenta no me funciona, y hay que asignar los valores de forma manual (yo ya los tengo asignados, pero voy a ver si te explico cómo hacerlo).

En las propiedades del proyecto (botón secundario en el proyecto y Properties del menú desplegable), selecciona en la parte de la izquierda iOS > Bundle Signing y en Scheme selecciona Automatic Provisioning (ver figura 2)

Figura 2. Configurar Bundle Signing para iOS

Pulsa en el «enlace» Configure Automatic Provisioning y te mostrará un asistente en el que tendrás que indicar la cuenta de Apple (puede ser que la tengas que indicar antes) y de ahí seleccionar la que hayas definido como cuenta de individual (no la que tiene el ID de Apple, si no la que configures manualmente, (ahora te explico cómo) (ver figura 3)

Figura 3. Las cuentas para configurar el aprovisionamiento para iOS

Para configurar la cuenta, pulsa en el enlace Manage Account (figura 2) y ahí tendrás que añadir tu ID de Apple (normalmente una cuenta de correo electrónico).

En el botón «Add» selecciona «Indivudual Account» (figura 4) y rellena los datos que te pide (en Apple Developer puedes encontrar esos datos y cómo crear el «private key». (figura 5).

Figura 4. añadir una cuenta individual
Figura 5. Configurar la cuenta individual

Nota:
Si necesitas saber cómo configurar la cuenta individual (figura 5), puedo ayudarte por un módico precio, vamos como una invitación virtual, pero me lo tienen que pedir y ya nos arreglamos con el donativo por PayPal 😉

Una vez que tienes todo esto, ya solo es compilar y cantar… 😉

Después sigo explicándote más cosas (pero lo primero era crear el proyecto de pruebas).

Este proyecto lo publicaré ya está publicado en GitHub para que puedas descargarlo e ir viendo el código y el diseño (ver abajo el enlace).

Nos vemos.
Guillermo

P.S.
El repositorio de GitHub ya está creado: Trucos_MAUI.

Cómo solucionar el error de .NET MAUI: Platform version is not present for one or more target frameworks

Pues eso, que al crear un proyecto para .NET MAUI con Visual Studio 2022 (no preview), concretamente con Microsoft Visual Studio Community 2022 (64-bit) – Version 17.3.5, al intentar usar el proyecto (incluso sin modificar nada) me soltaba ese error: Platform version is not present for one or more target frameworks (concretamente para ios).

Buscando en la red de redes (internet) me topé con varias soluciones que no solucionaban nada (o yo no sabía cómo aplicar esas soluciones, todo hay que decirlo), y al final «trasteando» con el comando workload de dotnet (que en su día usé, sin éxito, para intentar instalar el workload de iOS), probé con una de las opciones o comandos que te da. Al usar dotnet workload -h te muestra esto:

Commands:
  install <WORKLOAD_ID>         Install one or more workloads.
  update                        Update all installed workloads.
  list                          List workloads available.
  search <SEARCH_STRING>        Search for available workloads.
  uninstall <WORKLOAD_ID>       Uninstall one or more workloads.
  repair                        Repair workload installations.
  restore <PROJECT | SOLUTION>  Restore workloads required for a project.

Y de ahí la que he usado es la última, que suena bien…

Así que, te sitúas en el directorio en el que está el proyecto de .NET MAUI, y escribes (todo esto en la terminal, el shell o línea de comandos, como prefieras llamarlo):

dotnet workload restore "nombre del proyecto.csproj"

Por supuesto, debes sustituir «nombre del proyecto.csproj» por el nombre de tu proyecto y no es necesario ponerlo entre comillas.

Nota:
Puede ser que a los workloads se le vaya la olla… sí… así que… lo mismo un dotnet workload repair puede que lo tengas que usar.

Espero que a ti también te funcione.

Nos vemos.
Guillermo

Cambiar el tamaño de la ventana de Windows (WinUI) en app de .NET MAUI

Pues eso… ahora le toca lo de cambiar el tamaño de una ventana de Windows (WinUI que es como se llama la plataforma de Windows en .NET MAUI (en Xamarin es UWP), aquí solo te voy a mostrar el código de un tamaño fijo, ya que no me he puesto a experimentar cómo usar el tamaño predeterminado, ya que la forma de hacerlo es con otras APIs y… pues eso… que no me gusta demasiado el .NET MAUI como para dedicarle más tiempo de lo justo y necesario… 😉

Lo que si te quiero decir, es que precisamente me puse a mirar todo esto de cambiar el tamaño porque a diferencia de las aplicaciones con Xamarin.Forms, als de .NET MAUI «no recuerdan» el tamaño de la ventana en las siguientes veces que se use la aplicación, algo que en las de Xamarin sí hace, es decir, se muestra con el tamaño predeterminado y si cambias el tamaño de la ventana, la próxima vez que se utilice usará ese último tamaño.

Pero en las aplicaciones de .NET MAUI, siempre usa el tamaño «grande» y… pues como que no, por eso me puse a investigar, primero para hacerlo en .NET MAUI, y ya puestos me puse a mirar para Xamarin.

¿Cómo cambiar el tamaño de la ventana de Windows (WinUI) en un proyecto de .NET MAUI?

Es muy simple, el código se pone en el constructor de la clase App principal (no la del proyecto de Windows) y el código podría ser como este que te muestro para poner la ventana en un tamaño de 800 x 900 (ancho x alto).

namespace CambiarTamañoWindows_MAUI;

public partial class App : Application
{
    public App()
    {
         InitializeComponent();


        // Indicar el tamaño para la app de Windows.
        Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), (handler, view) =>
        {
#if WINDOWS
            // Asignar manualmente el tamaño. 
            int winWidth = 800;
            int winHeight = 900;

                        var mauiWindow = handler.VirtualView;
                        var nativeWindow = handler.PlatformView;
                        nativeWindow.Activate();
                        IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(nativeWindow);
                        var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
                        var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
                        appWindow.Resize(new Windows.Graphics.SizeInt32(winWidth, winHeight));
#endif
        });

        MainPage = new AppShell();
    }
}

Y esto es todo lo que hay que hacer… simple, ¿verdad? pues sí, para qué engañarnos, aunque eso de tener que ponerlo en un condicional de compilación es un rollo, pero tiene sentido ya que solo es para un proyecto de Windows. El problema es que no te muestra nada el «intellisense» ni nada de esas monerías que tenía en el proyecto para Xamarin.

Una captura con el programa en funcionamiento.

Figura 1. La aplicación en funcionamiento.

Y esto es todo… ahora subiré el código (o parte de él) a GitHub y después te pondré el enlace.

Acuérdate de (si quieres) hacer un donativo en PayPal para poder seguir teniendo este sitio en funcionamiento, gracias.

Nos vemos.
Guillermo

P.S.
El código de ejemplo en GitHub: Cambiar Tamaño de la ventana de Windows (WinUI) con .NET MAUI.

Solución al error en .NET MAUI: Error MSB4018 The «XamlCTask» task failed unexpectedly.

Pues eso… todo el rollo que te conté ayer… al final tenía una fácil solución o su solución era fácil. Y es no usar el idioma de Cervantes.

Ya te conté todo el rollo con las aplicaciones usando las plantillas de .NET MAUI con Visual Studio 2022, que al final no compilaban por el dichoso error: Error MSB4018 The «XamlCTask» task failed unexpectedly. Y no era por otra cosa que por usar caracteres acentuados (con tilde) en el diseñador de XAML.

En la otra aplicación que me funcionaba, seguramente «de casualidad» no tenía ese tipo de caracteres, y me estaba volviendo loco. Porque ya no sabía qué hacer.

Y hoy, leyendo otro «feedback» al querer postear el error, era porque alguien quería usar un «dibujito» en el XAML y resulta que le daba error… y la solución era usar el código que corresponde a ese dibujo para así mostrarlo.

Yo lo he solucionado poniendo en el código el texto a mostrar.

Y lo que quería hacer era un ejemplo en el que se escribe un número en una caja de texto, se pulsa en un botón y se muestra el número escrito. Este ejemplo tan «simplón» es solo para demostrar a esta gente de Visual Studio / .NET MAUI que el control Entry falla y que solo admite el texto que se asigne, ya sea en tiempo de diseño o en tiempo de ejecución, pero que si escribes algo, ese valor no se tiene en cuenta, solo se usa el inicialmente asignado.

En la captura 1 puedes ver el proyecto en ejecución en el proyecto para Windows (UWP), y ahí te muestro que a pesar de haber escrito otro número distinto al asignado inicialmente (5) en la etiqueta no muestra el que se haya escrito.

Captura 1. La aplicación para .NET MAUI en funcionamiento.

Pues ya lo sabes (y espero yo saberlo también) 😉

Nos vemos.
Guillermo

Solucionando problemas con los proyectos de .NET MAUI en Visual Studio 2022 (o casi)

Pues eso… seguimos con los «problemitas» de Visual Studio 2022 y .NET MAUI. Después del fallo que te comenté anoche, me puso en la labor de crear un nuevo proyecto de .NET MAUI en Visual Studio 2022, con idea de comentar otro de los fallos con los que me encontré y es que en los controles Entry no se cambia el valor que hayas asignado (en diseño o por código).

Creé un nuevo proyecto de .NET MAUI, pero… nada de nada… el error que me mostraba (después de varios «cleanings» y «rebuilds» era que: XamlCTask «nosequénosecuántos» y ahí se quedaba.

Esto ya me pasó otra vez, lo solucioné (pero no recordaba como lo hice), por eso estoy escribiendo esto… por si lo soluciono lo tendré a mano 😉

Lo que ahora estoy haciendo (o el Windows 11 está haciendo) es esto:

Paso 1: Ejecutar maui-check.

En la línea de comandos (yo he abierto el terminal de Windows 11) escribe:
maui-check.

Esto comprueba si el «.NET MAUI» está correctamente instalado.

Nota:
Si esa utilidad no la tienes instalada… pues… tendrás que instalarlo, tal como te dije hace unos meses.

dotnet tool install -g redth.net.maui.check

Paso 2: Descargar e instalar todo lo que necesita .NET MAUI.

Escribe en la línea de comandos o la terminal de Windows 11:
dotnet workload install maui

Esto descargará e instalará lo que necesite tu equipo.

Ver la captura 1 con los dos comandos comentados.

Captura 1. El terminal de Windows 11 con los dos comandos.
Captura 1. El terminal de Windows 11 con los dos comandos.

Aunque esto no soluciona el error ese de Error MSB4018 The «XamlCTask» task failed unexpectedly. 🙁

Paso 3: Crear un nuevo proyecto.

Yo lo he creado desde la línea de comandos:
dotnet new maui -n MauiApp3
MauiApp3 es el nombre del proyecto que le he dado.

Pero también lo puedes crear desde el propio Visual Studio 2022.

En nuevo proyecto escribe MAUI en la búsqueda y pulsa INTRO y te mostrará los proyectos de .NET MAUI. Selecciona el primero tal como te muestro en la captura 2.

Captura 2. Nuevo proyecto de .NET MAUI.
Captura 2. Nuevo proyecto de .NET MAUI.

Paso 4: Editar el proyecto en Visual Studio 2022 e indicar que admita aplicaciones de Windows.

Lo abro con Visual Studio 2022, (o lo creo, tal como te he indicado en el paso anterior), edito el fichero del proyecto (en el explorador de soluciones pulsa con el botón secundario en el proyecto y selecciona Edit Project File) y quito el comentario en la línea:

<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows')) and '$(MSBuildRuntimeType)' == 'Full'">$(TargetFrameworks);net6.0-windows10.0.19041</TargetFrameworks>

En el valor TargetFrameworks que está justo encima de esa línea con los «frameworks» incluidos en el proyecto: net6.0-ios;net6.0-android;net6.0-maccatalyst.

Si ahora ejecutas el proyecto te dará error, ya que el «framework» que usará será el primero de la lista: net6.0-ios. Aunque arriba esté indicado que será en Windows Machine.

Para solucionarlo, debes cambiar el target framework indicado en la aplicación de Windows y seleccionar el de Windows (ver la captura 3):

Captura 3. Indicar el framework para las aplicaciones de Windows.
Captura 3. Indicar el framework para las aplicaciones de Windows.

Abajo, en la lista de errores más o menos te da pistas.

Y si después de eso (y tienes suerte) al pulsar F5 debería mostrarte la aplicación de ejemplo (ver la captura 4).

Captura 4, la aplicación de ejemplo en funcionamiento.
Captura 4, la aplicación de ejemplo en funcionamiento.

Nota interna pal Guille:
El proyecto que funciona (sin añadir código propio) es: MauiApp2 y MauiApp3 que están en «C / source / repos».

Una cosa a tener en cuenta:

Si pruebas con Android (emulador o dispositivo), y supongo que para iOS también, el framework se asignará correctamente, pero si vuelves a querer usar la aplicación en Windows, tendrás que volver a indicar el net6.0-windows10.0.19041.

Ahora no se te ocurra añadir tu propio código… jajaja porque es cuando empieza el espectáculo del error ese que te dije antes en el paso 2: Error MSB4018 The «XamlCTask» task failed unexpectedly.

A ver si consigo solucionarlo, porque ni haciendo todo lo anterior me ha funcionado.

Porque funcionar (aunque regulín-regulán) me ha funcionado, pero ya no recuerdo qué hice. A ver si doy con lo que fue… y te voy contando, porque ya son cerca de las 4 de la tarde del nuevo horario y hay hambre 😉

*** Seguimos

A ver… creo que era lo que comentaban en este «reporte de error»: VS 2022 MAUI project templates missing.

Ejecutando este código: dotnet new -i Microsoft.Maui.Templates indica que está todo instalado (otra cosa es que añadas una nueva página al proyecto, en ese caso, como es Xamarin.Forms te dará errores por todos lados, pero básicamente es cambiar las definiciones de los «usings» y cambiar los xmlns del diseñador).

En mi caso, al ejecutar ese código (ver la captura 5) dice que está todo instalado (y que ya lo estaba).

Captura 5. Instalar los templates de .NET MAUI.
Captura 5. Instalar los templates de .NET MAUI.

*** Seguimos (2)…

Yo qué sé… tengo un proyecto que funciona (mal, pero funciona con mi propio código), pero no consigo que los nuevos proyectos tengan el código que yo quiera (que de eso se trata, ¿no?).

Bueno, ahora sí, si lo soluciono, y sé/recuerdo cómo lo he solucionado, lo pondré aquí o en un post nuevo…

Solo me queda añadir una nueva página y ahí escribir el nuevo código…

Actualizado el 1 de noviembre de 2021.

Pues resulta que he conseguido crear un nuevo proyecto desde el propio Visual Studio 2022, añadirle código propio y hacer que funcione, y de paso comprobar que eso de los controles Entry falla.

Pero solo he tenido 3 oportunidades, desde la cuarta, ya no funciona… vuelve a salir el error de: The «XamlCTask» task failed unexpectedly.

Y ya… pues casi que lo dejo, hasta ver si es casualidad o es que se puede hacer algo para solucionar ese «dichoso» error.

Lo mandaré a esta gente a ver qué dicen… seguro que a ellos nunca les pasa 😉

¡¡¡Resulta que todo el problema eran las «tildes»!!!

Pues eso… he quitado una tilde que tenía en «número» y ahora funciona bien… jajajaja, como se suele decir: ¡pa mearse y no echar gota!

Es decir, el error de The «XamlCTask» task failed unexpectedly es porque hay caracteres «no normales».

Nos vemos.
Guillermo

.NET MAUI aún está muy verde (comparado con Xamarin.Forms)

Pues eso… por fin he logrado hacer algo medianamente útil con .NET MAUI y Visual Studio 2022 (acceso a datos, para ser más concreto) y… pues que en la aplicación de Windows (UWP) funciona bien, pero en la de Android ni de coña… Y ya con la de iOS ni te digo… es que ni siquiera compila… en fin…

La de Android se inicia, pero cuando digo de acceder a una base de datos, da error.

Seguramente será por el «idioma» (codificación). Ya que en las aplicaciones de Xamarin.Forms para que pueda acceder a las bases de datos de SQL Server le tengo que decir (a iOS también) que use la codificación WEST y entonces si funciona (ver la captura 1), pero no tengo ni repajolera idea de cómo hacerlo en .NET MAUI. 🙁

Captura 1. La opción en Xamarin.Forms para indicar que use la codificación oeste (west)
Captura 1. La opción en Xamarin.Forms para indicar que use la codificación oeste (west)

De todas formas, aunque funcione en Windows (me vale para las pruebas), hay cosas tan simples como que un Entry (el típico TextBox de .NET Framework, o casi) no permita que se cambie el contenido… Bueno, permitir, lo permite, pero como si le echaras un vaso de agua al mar para que aumente de nivel… Es decir, que no vale pa ná

En fin… y el día 8 de noviembre quieren lanzar el Visual Studio 2022… ¡que lo lancen! pero bien lejos… porque falla más que una escopetilla de plomos…

Eso sí, uno le dice a esta gente que fallos va encontrando, pero… ¡a ellos no les falla!… jajajaja me rio yo solo… por no llorar…

De hecho, con un bug «tonto» de seleccionar código con las teclas ALT+SHIFT (suelo hacerlo bastante cuando quiero copiar el código para colorearlo y publicarlo en este blog, por ejemplo).

Pues no hay forma de que esta gente sigan los mismos pasos que ya les he indicado varias veces, ellos lo hacen a su manera, y de esa forma no falla… pero no es lo mismo. Ya que, si yo quiero seleccionar algo que está indentado, en Visual Studio 2022 falla, sin embargo, en Visual Studio 2019 va bien.

Si tienes curiosidad, puede ver el «feedback» que yo lo titulé (en inglés para que no se pierdan mucho): BUG: Selecting block of text with SHIFT+ALT (+ Down, Left keys) moves the selection start down (not always).

Y algunos más… que, hasta pueden resultar graciosos, como el que al seleccionar el texto de esta forma se quedan varios cursores y si escribes algo se pone ese texto en todos los cursores que haya (uno por cada línea seleccionada).

Este es el enlace (y el título): BUG VS2022: Selecting with ALT+SHIFT, releasing the selection, the blue and red cursor remains and if you type the text typed is set in several places.

Bueno… no te canso más… aunque, si vives por estos lares… esta noche podrás dormir una hora más… que nos cambian el horario de verano al de invierno y… a las 3 de la madrugada serán las 2… 😉

Buenas noches.

Nos vemos.
Guillermo

Windows 11 maneja mejor la memoria en las app para Windows UWP de Xamarin.Forms

Pues eso… en la app para mobile en la que estoy inmerso desde hace meses, desarrollada con Visual Studio 2019 y Xamarin.Forms para Android, iOS y Windows UWP; uno de los problemillas que me he encontrado con la versión para Windows UWP (Universal Windows Platform) es que cuando le da el punto empieza a consumir memoria como ella sola… llegando hasta casi un GIGA y ni que la minimices ni nada, no para de subir, y normalmente también se ralentiza.

Sin embargo, en las pruebas que he hecho en el Windows 11, en una máquina virtual, ya que los de Windows Insiders dicen que mis equipos (un portátil con 3 años y una torre de hace un mes) no cumplen las características requeridas, y eso que la máquina virtual usa los recursos (procesador, memoria) desde el «computador» donde se está ejecutando esa máquina virtual. Pero ese es otro tema. Lo que te decía, en las pruebas hechas en el Windows 11 el consumo es muchísimo menor, además de que al minimizar la aplicación libera esa memoria, según indica el administrador de tareas (Task Manager) del propio Windows.
En las figuras 1 y 2 puedes ver las capturas de esos dos casos.

 

Figura 1. La app abierta en Windows 11 (159,8 MB)

 

Figura 2. La app minimizada baja a 7,0 MB el consumo de la memoria y con el simbolico ese verde 😉

La versión de Windows 11 que tengo instalada es Windows 11 Pro versión 21H2 build 22000.168 co_release. Esta creo que se instaló usando el «canal» Dev Channel (que instala lo último que tengan), aunque momentáneamente lo cambié al Beta Channel por aquello de que mandaron un email recomendando que se utilizara ese canal y en la ventana de Windows Insider Program la marcan como recomendada.

Aparte de esto, el Windows 11 me está gustando… antes me parecía que los cambios eran prácticamente estéticos (el look), pero ahora veo que hay algo más 😉

Y ya no te entretengo más… que hoy es sábado, sabadate… camisa nueva y p*****e (o eso dicen).

 

Nos vemos.
Guillermo

P.S.
He actualizado las fotos, para que se vena mejor y ocupen menos espacio, que no es plan de utilizar más datos de la cuenta 😉

Cómo refrescar los datos en aplicaciones de Xamarin.Forms o .NET MAUI

Pues eso… con el título de este post: Cómo refrescar los datos en aplicaciones de Xamarin.Forms o .NET MAUI, aparte de referirme que es para apliciones multiplataforma/multidispositivos creadas con Xamarin.Forms o .NET MAUI, me refiero a esos casos en los que quiero que se muestre un mensaje (por ejemplo en el texto de una etiqueta) mientras la aplicación hace cosas que pueden tardar un poco, como leer los datos de una base de datos o contar hasta cientocuincuentamilmillonesdetrillones, por decirte algo 😉

En .NET Framework / aplicaciones de Windows.Forms, yo suelo usar el fatídico (para algunos) Application.DoEvents(), que sí, que dicen que usando el Thread.Sleep se supone que hace lo mismo, pero yo te digo que no, a mí no me ha funcionado nunca.

Con la aplicación mobile en la que estoy enfrascado desde hace ya unos 3 meses, intenté el Sleep, intenté crear/usar un temporizador (otra de las formas en que hago con .NET Framework esa pequeña pausa para refrescar), pero nada de nada… Probé haciendo los métodos asíncronos para que fuesen «agüeitable» (async y await), pero nada de nada…

Sin embargo ayer, buscando en la red de redes (Inernet por si no sabías que así se le llama algunas veces), me encontré con una consulta en la que respondían eso que tanto estaba buscando saber cómo hacer, y la respuesta la encontré, (casi como de costumbre), en stackoverflow, concretamente aquí.

Y es usando Task.Delay(...) a la que tenemos que indicar los milisegundos de espera.
En esa respuesta indican dos formas de hacerlo: de forma asíncrona y de forma síncrona, decirte que la que a mí me ha funcionado es la asíncrona, la otra, como si miraras al cielo esperando ver pasar un elefante rosa… por decir algo… Vamos, que ni de coña esperaba…

Y como he visto que funcionaba, me he creado un método compartido en la clase App para que me sea fácil usarla desde cualquier parte de la aplicación, a ese método lo he llamdo Refrescar y recibe un parámetro con los milisegundos que quieres esperar antes de seguir, yo suelo usar el valor 300, que es el que casi siempre uso en los temporizadores que pongo en las aplicaciones de escritorio creadas con .NET Framework.
Este es el código de ese método (en C# ya que por ahora las aplicaciones de Xamarin.Forms / .NET MAUI son (y segurián siendo solo) para el cochambros lenguaje ese de los puntos y comas.

Y si te ha molestado que diga cochambroso lenguaje, de verdad que lo siento, pero… es lo que me parece a mí, al menos en la forma que yo lo uso, es una pequeña caca comparado con Visual Basic. Ya sabes: cochambros es lleno de mugre o cochambre que viene de cocho, puerco… ¡UF! me vas a odiar como seas fanático del C#, pero es lo que hay, es mi opinión, pero con fundamentos.

El código

Bueno, a lo que vamos, este es el código:

/// <summary>
/// Hacer una pequeña pausa para refrescar.
/// </summary>
/// <param name="intervalo">El tiempo que hay que esperar (en milisegundos).</param>
async public static Task Refrescar(int intervalo = 300)
{
    await Task.Delay(intervalo);
}

El valor predeterminado es de 300 milisegundos, es decir, menos de un tercio de segundo, incluso con 100 iría bien, pero…

Cómo lo utilizo

En uno de los casos, tengo una etiqueta en la que muestro el total de datos que leo de la base de datos, mientras se hace la búsqueda muestro un mensaje diciendo algo como: Leyendo los datos…, hago la pausa, (se refreca el contenido de la etiqueta) y mientras llamo al método que lee los datos, en el que actualizo esa etiqueta con los datos mostrados, etc.

LabelInfoReservas.Text = $"Leyendo las reservas de '{ElCliente.Nombre}'...";

// refrescar...
//await Task.Delay(300);
await App.Refrescar();

await asignarLasReservas();

En la siguiente captura, puedes verlo (me ha dado tiempo a hacerla a pesar de que había pocos datos que leer porque, esa es la impresión que a mí me da, las aplicaciones para Windows-UWP de Xamari.Forms / .NET MAUI son algo lentas… en ocasiones muuuucho más lentas que las aplicaciones para escritorio hechas con .NET Framework 4.8. Tanto que esta app móvil no podremos usarla al 100% en la playa porque hay poca cobertura móvil (de datos) que ya se hace insufrible utilizarla, y en este caso no creo que sea porque está hecha con C# 😉

Captura de la app con el mensaje mientras lee los datos de la base de datos.

Y ya está… eso es todo, simple, ¿verdad? pues… sí… 😉

Nos vemos.
Guillermo