Archivio Categoria: .net

Project Rome e cross device su IoProgrammo

ioprogrammo_july2017

Questo mese su IoProgrammo numero 215 di Luglio troverete il mio nuovo articolo su Project Rome e come utilizzarlo per condividere dati e funzionalità tra le varie piattaforme su cui la vostra applicazione è disponibile.

Una funzionalità disponibile in windows 10 che potrà dare una marcia in più alle vostre applicazioni.

Buon coding!!

 

Utilizzare il ProgressRing nell’ActivityIndicator in Xamarin Forms

Su Xamarin forms per le app UWP il componente ActivityIndicator è mappato sulla classe ProgressBar e come è possibile potete vedere nello screen non è un comportamento congruente con le altre piattaforme e la momento non c’è modo di cambiarlo con un ProgressRing.

activityindicatorCon il meccanismo dei CustomRenderer possiamo ovviare a questo problema in modo molto semplice inserendo una semplice classe nel nostro progetto UWP

[assembly: ExportRenderer(typeof(ActivityIndicator), typeof(RingActivityIndicatorRenderer))]
namespace DoGethersApp.UWP
{
    public class RingActivityIndicatorRenderer : ViewRenderer<ActivityIndicator, Windows.UI.Xaml.Controls.ProgressRing>
    {
        private Brush foregroundDefault;
        protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)

            {
                if (Control == null)
                {
                    SetNativeControl(new Windows.UI.Xaml.Controls.ProgressRing());
                    Control.Loaded += OnControlLoaded;
                }
                UpdateIsRunning();
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == ActivityIndicator.IsRunningProperty.PropertyName)
            {
                UpdateIsRunning();
            }

            else if (e.PropertyName == ActivityIndicator.ColorProperty.PropertyName)
            {
                UpdateColor();
            }
        }

        void OnControlLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            foregroundDefault = Control.Foreground;
            UpdateColor();
        }

        void UpdateColor()
        {
            Color color = Element.Color;
            if (color == Color.Default)
            {
                Control.Foreground = foregroundDefault;
            }
            else
            {
                Control.Foreground = color.ToBrush();
            }
        }

        void UpdateIsRunning()
        {
            Control.IsActive = Element.IsRunning;
        }
    }

    internal static class ConvertExtensions
    {

        public static Brush ToBrush(this Color color)
        {
            return new SolidColorBrush(color.ToWindowsColor());
        }

        public static Windows.UI.Color ToWindowsColor(this Color color)
        {
            return Windows.UI.Color.FromArgb((byte)(color.A * 255), (byte)(color.R * 255), (byte)(color.G * 255), (byte)(color.B * 255));
        }
    }
}

in questo modo verranno modificati tutti gli ActivityIndicator per utilizzare il ProgressRing, se vogliamo avere però maggior libertà e decidere se  e quando utilizzarlo ci basterà fare nel progetto comune una nuova classe che estende ActivityIndicator e modificare il CustomRender facendo riferimento a quest’ultima classe.

In questo modo potremo decidere su utilizzare una o l’altra a seconda delle esigenze, sulle altre piattaforme sarà visualizzato sempre lo stesso componente mentre su windows verrà visualizzato un tipo di progressbar o l’altra in base alla classe che utilizzeremo.

Buon coding!!!

 

UWP: ricreiamo la funzione ToTitleCase

Come ben sappiamo la piattaforma UWP non dispone di tutte le funzionalità presenti nella versione del .Net Framework versione desktop. Una funzione che può essere utile in alcuni casi è ToTitleCase che come possiamo intuire dal nome converte il testo in parole con iniziali maiuscole come è possibile vedere nella documentazione ufficiale

https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

La versione standard permette di fare controlli più fini anche in base alla lingua di sistema ma se abbiamo bisogno solo della sua funzione base possiamo utilizzare questo semplice metodo

public string toTitleCase(string value)
{
    if (value == null)
        return null;
    if (value.Length == 0)
        return value;

    StringBuilder result = new StringBuilder(value);
    result[0] = char.ToUpper(result[0]);
    for (int i = 1; i < result.Length; ++i)
    {
        if (char.IsWhiteSpace(result[i - 1]))
            result[i] = char.ToUpper(result[i]);
        else
            result[i] = char.ToLower(result[i]);
    }
    return result.ToString();
}

che converte in maiuscolo l’iniziale di ogni parola ed in minuscolo quelle seguenti.

Una piccola utility che a volte può tornare utile

Buon coding!!!

Eliminare le lingue non inserite quando si invia un’app UWP allo store

Se state sviluppando un’app solo a livello nazione per cui non volete inserire la lingua inglese potreste ritrovarvi la richiesta , anche se non avete inserito i relativi file, di compilare i dati nello store anche per questa lingua nel momento in cui la invierete.

Questo problema si presenta quando una libreria che stiamo utilizzando contiene già alcuni file localizzati, ad esempio per gestire i messaggi di errore (es. MVVM Light), in questo caso Visual Studio generà erroneamente anche il pacchetto per la lingua inglese.

Per risolvere il problema basterà aprire il file di progetto ed aggiungere la seguente riga
<SkipIntermediatePriGenerationForResourceFiles>false</SkipIntermediatePriGenerationForResourceFiles>

subito dopo l’apertura del primo tag PropertyGroup che troverete in modo da avere una situazione del genere

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
 <PropertyGroup>
 <SkipIntermediatePriGenerationForResourceFiles>false</SkipIntermediatePriGenerationForResourceFiles>
 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

Se avete dei problemi a trovare il file di progetto potete scaricare il progetto facendo tasto destro sull’elemento

unload_menu

e poi editarlo sempre utilizzando il tasto destro sul progetto scaricato

edit_project

una volta modificato il file, sempre con il tasto destro, sarà possibile ricaricarlo.

NB: Potreste ritrovarvi con un messaggio di errore simile a questo

err_1potete tranquillamente ignorarlo e caricare il vostro progetto.

Se adesso genererete il vostro pacchetto e lo invierete allo store vedrete che verranno richiesti i dettagli esclusivamente per le lingue effettivamente incluse nella vostra app

Grazie a Fela per il tip!!!

Buon coding!!

La vostra nuova app per windows 10 appena pubblicata non è ancora visibile? Facciamo un pò di chiarezza

Ultimamente ho letto su molti siti e forum di persone che si lamentano che la loro nuova app appena pubblicata che ha passato tutti i controlli non è ancora visibile o scaricabile.La cosa è normale vista la complessa architettura che c’è dietro, le varie cache e allineamenti dei server. Basandomi sulla mia esperienza ecco le tempistiche che ho potuto registrare nei vari step

Pagina sullo store / store web

Di solito visibile entro circa 24h dalla pubblicazione, in alcuni rari casi sono arrivato anche a 48h

Disponibilità app al download

Di solito entro 24h/48h dalla visibilità dell’app. Durante questo lasso di tempo possono esserci utenti che potranno scaricarla ed altri che riceveranno degli errori dallo store o vedranno l’app come ancora non disponibile

Non disperate quindi se non vedete la vostra nuova app scaricabile o se qualcuno vi segnala qualche problema, vedrete che massimo entro 3/4 giorni tutto andrà a posto.

Naturalmente nel caso di aggiornamento i tempi saranno decisamente ridotti e di solito in qualche ora sarà visibile.

Il mio consiglio è quindi di aspettare a pubblicizzare la vostra app, sò che fremete ma conviene attendere qualche giorno per evitare i commenti negativi degli utenti che non riescono a scaricarla.

Sono passati 4 giorni e la mia app ancora ha dei problemi nel download o non è visibile

Il team dello store ha pensato anche a questo caso, è stato infatti aggiunto un link per poter segnalare questo problema nella sezione submissions

store_help

Occorre quindi avere solo un pò di pazienza e al 99% la visibilità della vostra app si sistemerà sola!

Buon coding!

UWP: ListView con larghezza degli elementi al 100%

Se volete che in una vostra app gli elementi di una ListView occupino il 100% dello spazio disponibile orizzontalmente dovrete andare a modificare il tema del controllo ListView e non sarà sufficiente utilizzare la solita proprietà HorizontalAlignment=”Stretch” del controllo in questione.

Lo stile che andrà modificato è più precisamente l’ItemContainerStyle.

E’ possibile farlo in modo molto semplice utilizzando le seguenti righe da codice da inserire all’interno del tag <ListView><ListView> della vostra app

<ListView.ItemContainerStyle>
 <Style TargetType="ListViewItem">
 <Setter Property="HorizontalContentAlignment" Value="Stretch" />
 </Style>
 </ListView.ItemContainerStyle>

Buon coding!!

UWP: Lavorare con i file – i permessi

Riscrivendo come UWP la mia app Your Files e volendo trasformarla anche in un file manager ho avuto (e stò avendo) molto a che fare con la gestione dei files. Ho deciso quindi di scrivere questa serie di post cercherò di condividere  quello che ho imparato in modo che possa essere utile anche ad altri.

Questi post hanno come riferimento le app UWP per windows 10 ma visti i punti in comune con la versione RT della piattaforma (Windows 8/8.1 e Windows Phone 8.1 RT) quanto sarà descritto potrà essere applicato anche ad essa.

Permessi per accedere ai file

Le app UWP per poter essere controllate e non fare danni o accedere a file sensibili sono confinate in una sandbox e hanno necessità che gli vengano forniti i permessi per poter accedere ai file sul file system.

L’accesso ai file può avvenire in due modi:

  • Attraverso il file di manifest
  • Attraverso una richiesta programmatica all’utente (FilePicker)

Permessi attraverso il file di manifest

Tramite il file di manifest possiamo selezionare due permessi di accesso alla raccolta musicale ed alle immagini che ci permettono di avere accesso diretto alle due cartelle relative

manifest

 

Per tutti gli altri file e cartelle (compresa quella dei documenti) occorre fare esplicita richiesta all’utente

Permessi tramite esplicita richiesta

Per poter richiedere il permesso di poter accedere a qualsiasi file o cartella (non protetta) del file system Windows 10 ci mette a disposizione gli oggetti FileOpenPicker e FileSavePicker per i file e FolderPicker per le directory

Iniziamo a vedere un esempio di come ottenere l’accesso ad un file

// Configurazione
 FileOpenPicker fop = new FileOpenPicker();
 fop.FileTypeFilter.Add(".png");
 fop.FileTypeFilter.Add(".jpeg");
 fop.FileTypeFilter.Add(".jpg");
 
 // Interazione con l'utente
 StorageFile sf=await fop.PickSingleFileAsync();
 // controllo se il file è stato selezionato
 if (sf != null)
 

Come potete vedere una volta creato l’oggetto FileOpenPicker è necessario popolare la lista FileTypeFilter con le estensioni tra cui vogliamo che l’utente possa scegliere.

Considerazione importante è che non è possibile aggiungere il filtro .* o simili sempre per motivi di sicurezza, quindi è necessario sempre inserire la lista completa delle estensioni che si vogliono gestire

Se vogliamo invece avere accesso a tutti i file di una cartella (e di tutte le relative sottocartelle) possiamo utilizzare il FolderPicker in modo molto simile a come visto precedentemente

FolderPicker fp = new FolderPicker();
StorageFolder folder=await fp.PickSingleFolderAsync();
if(folder!=null)

Mantenere i permessi ricevuti

Utilizzando il codice che abbiamo visto negli scorsi paragrafi saremo costretti a richiedere i permessi ogni volta che andiamo ad utilizzare una cartella, anche se l’utente li aveva già dati in una sessione precedente. Per risolvere il problema possiamo utilizzare l’oggetto FutureAccessList che ci permette di memorizza cartelle e file con relativi permessi per un utilizzo futuro.

In più ad ogni oggetto possiamo assegnare un token per una ricerca più veloce.

L’utilizzo è decisamente semplice

// Aggiunta di una cartella o file alla lista
 StorageApplicationPermissions.FutureAccessList.Add(folderOrFile, metadata);
 
// Ripristino di un file o folder con i relativi permessi
StorageFile sf=await StorageApplicationPermissions.FutureAccessList.GetFileAsync(token);
 StorageFolder folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token);

La classe mette a disposizione anche ulteriori metodi come CheckAccess per controllare se sono presenti i permessi per una determinata cartella.

Conclusioni

In questo post abbiamo visto come vengono devono essere gestiti i permessi per accedere ai file nelle nostre app.

Rispetto alla normale programmazione desktop occorre avere qualche accortezza in più, ma è lo scotto da pagare per avere una piattaforma più sicura.

Nei prossimi articoli vedremo come visualizzare modificare tutti i dettagli dei file e come utilizzarli per scrivere e leggere le informazioni in essi contenute

Se avete qualche dubbio lasciate pure un commento! Buon coding!!

UWP: Come modificare il FontSize in alcuni controlli bloccati

Lavorando ad una app una delle modifiche grafiche più comuni che si vuole eseguire è quella della modifica della dimensione del font utilizzato.

Questa operazione di solito è eseguita semplicemente tramite la property FontSize, ma in alcuni casi potremmo trovarci davanti ad alcuni controlli come il CalendarDatePicker e l’AutoSuggestBox in cui anche andandola ad impostare non avremo nessuna effetto.

Per riuscire nel nostro scopo quello che dobbiamo fare è andare a modifiche direttamente la stile per quel controllo, per farlo basta creare un nuovo templare da poter modificare. Visual Studio ci permette in modo molto semplice di avere una copia già pronta su cui poter lavorare, è sufficiente selezionare con il tasto destro il controllo e utilizzare il menu Edit Template -> Edit a Copy

edit_template
Avremo adesso a disposizione tutto lo stile da poter modificare.

Quello che dobbiamo fare è cercare il controllo TextBlock o TextBox che viene utilizzato per mostrare il testo ed andare a modificarlo.

Ad esempio per il CalendarDatePicker dovremo modificare lo style nel seguente modo andando a cambiare il FontSize già presente

 <!-- change FontSize property-->
<TextBlock x:Name="DateText" Foreground="{ThemeResource SystemControlForegroundBaseMediumBrush}" FontSize="40" HorizontalAlignment="Left" Padding="12, 0, 0, 2" Grid.Row="1" Text="{TemplateBinding PlaceholderText}" VerticalAlignment="Center"/>

Mentre nel caso dell’AutoSuggestBox dovremo procedere aggiungendo il FontSize che non è presente nello style

 <!-- Add FontSize property-->
<TextBox x:Name="TextBox" FontSize="40" ScrollViewer.BringIntoViewOnFocusChange="False" DesiredCandidateWindowAlignment="BottomEdge" Header="{TemplateBinding Header}" Margin="0" PlaceholderText="{TemplateBinding PlaceholderText}" Style="{TemplateBinding TextBoxStyle}" Width="{TemplateBinding Width}" Canvas.ZIndex="0"/>

E’ possibile trovare un esempio completo nel mio repository github nel progetto di esempi per le api UWP QUI

Buon coding!!!  😀

La nostra prima UWP su XBox

Build, la conferenza più importante per sviluppatori di Microsoft di quest’anno è stata piena di novità per noi sviluppatori (tra cui anche xamarin gratuito) e forse una delle più attese era la possibilità di far girare le proprie app UWP sulla XBox di casa senza necessità di acquistare nessun devkit o dover fare sblocchi particolari.

Per fortuna dopo qualche anno di attesa siamo stati accontentanti e la funzionalità è stata rilasciata pubblicamente con una propria pagina ufficiale sul portale developer di microsoft.

In questo post vedremo insieme come far partire la nostra prima app su XBox e quali sono i limiti al momento.

Prerequisiti

Per poter sviluppare su XBox One abbiamo bisogno di

  • una XBox One (decisamente scontato 😀 )
  • un account sviluppatore per attivare l’XBox (se non lo avete il costo è di circa 20€ una tamtum)
  • un pc con installato Visual Studio 2015 update 2 (và bene qualsiasi versione, io ho utilizzato la community)
  • Windows 10 SDK preview build 14295 (non è obbligatorio utilizzarlo ma ci permette di avere gli strumenti più aggiornati per le nuove funzionalità e classi)

Attiviamo la modalità sviluppatore sulla nostra XBox

Innanzi tutto abbiamo bisogno di una XBox One che non faccia parte di nessun programma di preview, quindi se la nostra console fa già parte dell’update preview dobbiamo uscirne. L’operazione può essere fatta direttamente dall’app Xbox Preview Dashboard, unico neo è che non sarà immediata ma potrà richiedere alcuni giorni per essere effettiva (nel mio caso ci sono volute circa 48 ore), tutti i dettagli sulle operazioni da eseguire sono disponibili nelle FAQ ufficiali del programma preview

Una volta che la nostra console sarà nel canale standard degli aggiornamenti, dovremo installare dallo store XBox l’app  Dev Mode Activation e seguire le semplici operazioni a schermo che ci guideranno all’attivazione della nostra console tramite il nostro account developer.

xbox_dev4

Tutto quello che dovremo fare è raggiungere la pagina https://developer.microsoft.com/xboxactivate ed inserire il codice fornito. Da questa stessa pagina sarà anche possibile disattivare le console che avete precedentemente attivato.

E’ disponibile una guida ufficiale a questo indirizzo se avete problemi (ma il tutto è veramente semplice)

Una volta seguiti tutti i passaggi ci verrà chiesto di scaricare un aggiornamento del sistema operativo che porterà la nostra console nel ramo di sviluppo Redstone di Windows 10

ATTENZIONE: l’installazione non comporterà la perdita di nessun dato, la formattazione (e quindi la perdita di tutto ciò che è presente nella console) sarà necessaria esclusivamente se si vuole uscire dalla developer preview e tornare nel ramo standard (al momento non ho trovato problemi particolari con questa preview, ma devo dire che non sono un gran giocatore quindi non l’ho testata con molti titoli).

Una volta che la nostra console si sarà riavviata potremo tornare all’app Dev Mode Activation e utilizzare il pulsante Switch and Restart per passare alla modalità sviluppatore.

xbox_dev1

L’XBox a questo punto dopo qualche secondo di attesa si riavvierà (non preoccupatevi se il riavvio sarà più lungo del solito, è una cosa normale) e vi troverete davanti una schermata di home molto più scarna di quella a cui siamo abituati, con poche tile e senza i giochi che abbiamo installato.

Sulla destra avremo una nuova app Dev Home fondamentale per avere i dettagli della nostra console per poterci connettere da Visual Studio. Nella parte superiore sinistra è infatti possibile visualizzare l’indirizzo ip della nostra console, mentre nella colonna centrale sarà possibile generare un pin per visual studio oppure rimuovere un pin già utilizzato.

xbox_dev2

Lanciamo la nostra app da Visual Studio

Ogni app UWP può essere potenzialmente eseguita sulla nostra console, tutto quello che dobbiamo fare è impostare come piattaforma x64 o x86 e come destinazione “Remote Machine“. Al primo tentativo di avvio ci verrà richiesto l’indirizzo ip della macchina a cui connettersi ( come detto precedentemente è disponibile nell’app dev home), è necessario che l’autenticazione sia impostata su Universal, altrimenti la connessione non avrà successo.

I parametri di connessione saranno modificabili in ogni momento nelle impostazioni della soluzione nella sezione debug.

xbox_dev3

Come ultimo passaggio ci verrà chiesto di inserire un pin generato dall’app Dev Home di cui abbiamo parlato in precedenza.

A questo punto la nostra app sarà finalmente eseguita sulla console.

Anche per queste operazioni da eseguire su Visual Studio è disponibile un tutorial ufficiale

Limitazioni

Al  momento altre a molti bug conosciuti più o meno gravi di cui è possibile trovare una lista QUI quella che abbiamo a disposizione è una primissima versione dell’ambiente di sviluppo basato sulla piattaforma UWP e quindi con molte api non ancora implementate. Una lista delle implementazioni mancanti è disponibile QUI.

La mancanza dell’implementazione non porterà alla non esecuzione dell’applicazione che utilizza queste API ma i metodi semplicemente ritorneranno valori nulli, un esempio è quello dei vari FilePicker che una volta richiamati non visualizzeranno nulla ma ritorneranno un semplice valore null come se l’utente avesse annullato la selezione.

Lo store

Al momento lo store non è stato ancora unificato con quello presente sugli altri dispositivi windows 10 ma con il prossimo update la transizione sarà completa e le nostre app potrannno essere disponibili per tutti, per ora quindi l’unico modo per installare le nostre app è quello di passare per l’ambiente di sviluppo

Al momento non è dato sapere quali requisiti si dovranno avere per poter pubblicare le proprie creazioni sullo store della console. Per i giochi quasi sicuramente ci sarà un controllo qualità preventivo per mantenere uno standard elevato, per le app invece si spera ci sia una maggior flessibilità e semplicità di accesso.

Sicuramente nei prossimi mesi ne sapremo di più

Conclusioni

Il rilascio dei tool di sviluppo UWP per XBox è stato accolto con molto entusiasmo, al momento però è necessario ancora molto lavoro prima di poter avere una piattaforma utilizzabile e stabile ma i primi sviluppi sono decisamente interessanti e sicuramente con i prossimi aggiornamenti che arriveranno a breve la situazione migliorerà velocemente.

Al momento lo scopo di questo SDK è quello di permetterci di poter iniziare ad adattare le nostre app soprattutto nell’interfaccia e nell’utilizzo del joystick che normalmente non è contemplato come metodo di input nelle nostre app ma qui sarà l’unico mezzo di interazione.

Bisogna ammettere che veder girare le proprie app su una console è decisamente una bella soddisfazione 😀 anche perchè sulle altre piattaforme presenti sul mercato questa cosa non è possibile per sviluppatori senza un grande team alle spalle.

Se avete una XBox One e siete sviluppatori adesso non dovete far altro che dar sfogo alla vostra fantasia e sviluppare app che potranno veramente entrare nei salotti di tutte le case!

Buon Coding!!

 

UWP: Quale device stà eseguendo la nostra app

La piattaforma UWP mette a disposizione molte tecniche per gestire le differenze tra le varie piattaforme a partire dal check delle funzionalità fino ad arrivare ai VisualState ma in alcuni casi potrebbe essere necessario comunque controllare la piattaforma dove la nostra app stà girando.

Il framework ci mette a disposizione la proprietà AnalyticsInfo.VersionInfo che contiene il nome del sistema in cui l’app stà girando, con i seguenti valori

  • Windows.Desktop
  • Windows.Mobile
  • Windows.IoT
  • Windows.Xbox
  • Windows.HoloLens
  • Windows.Team

naturalmente andando avanti ci saranno sempre nuovi valori possibili

quindi ad esempio per controllare se la nostra app stà girando su uno smartphone basterà controllare

 if(Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Mobile")

naturalmente la miglior soluzione è sempre quella di utilizzare gli strumenti messi a disposizione e limitare questi controlli in casi decisamente particolari visto che il numero numero dei valori potrebbe aumentare nel tempo e quindi la nostra app potrebbe non funzionare al meglio!

Buon coding!

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi