[Flickr.2] Startup dell’applicazione in WPF
Per questo primo esperimento, non ho grandi pretese. Voglio un’applicazione Windows che si connetta a Flickr e che permetta di sfogliare i sets di un certo utente, con tutte le sue foto. Il tutto in WPF, ovviamente. I concetti base li abbiamo visti ieri nel precedente post.
Il progetto che ho costruito fino ad adesso comprende due sole Window: MainWindow (la window principale dell’applicazione) e WaitingWindow (la window che appare all’avvio per autenticare l’applicazione). Il file app.xaml è definito nel modo seguente:
<Application x:Class="FlickrBrowser.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> </Application>
Non ci sono risorse a livello applicazione, ed inoltre si deduce che la window che parte è proprio la MainWindow.
Il costruttore di tale classe è molto semplice:
public MainWindow() { InitializeComponent(); authenticate(); }
Il metodo privato authenticate() apre una seconda Window, che esamineremo adesso. Lo scopo di questa window è quello di fare tutto quello che abbiamo detto la volta scorsa, ovvero: connettersi a Flickr, richiedere un frob, apre il browser per autenticare l’applicazione e dare il consenso. Roba già dette, insomma.
La window WaitingWindow
Questa window appare all’avvio e ci mostra due Button: il primo apre un browser ad un certo url, il secondo accede a Flickr con le credenziali che sono state autorizzate. Lo XAML che definisce la window è:
<Window x:Class="FlickrBrowser.WaitingWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:b="clr-namespace:FlickrBrowser" Title="Permission" Width="260" Height="138" WindowStartupLocation="CenterScreen" ResizeMode="NoResize"> <StackPanel Orientation="Vertical"> <b:FlickrButton Width="240" Margin="6" x:Name="openBrowserButton" Height="40"> <Button.Content> <TextBlock HorizontalAlignment="Center" Text="Open the browser!"> </TextBlock> </Button.Content> </b:FlickrButton> <b:FlickrButton Width="240" Margin="6" x:Name="closeWindowButton" Height="40" IsEnabled="False"> <Button.Content> <TextBlock HorizontalAlignment="Center" Text="Ok, I've authenticated this application!"> </TextBlock> </Button.Content> </b:FlickrButton> </StackPanel> </Window>
C’è uno StackPanel verticale e due Button. I Button non sono quelli classici di WPF, ma sono FlickrButton: una classe che eredita da Button ma ne specifica alcuni comportamenti. Non ci interessa in questo momento capire il perchè ed il percome: ci basti sapere che funzionano esattamente come due normalissimi Button. Per inserirli nello XAML, ho dovuto inserire un riferimento all’assembly FlickrBrowser, identificandolo con il prefisso b. Il costruttore della WaitingWindow è il seguente:
public WaitingWindow() { InitializeComponent(); conn = new Flickr(apiKey, secretKey); openBrowserButton.Click += new RoutedEventHandler(openBrowserButton_Click); closeWindowButton.Click += new RoutedEventHandler(closeWindowButton_Click); }
Ovvero: si connette a Flickr usando api key e secret key ed associa due event-handler ai due pulsanti (avrei potuto ovviamente farlo nello XAML – non so perchè mi è uscito così). Il primo event-handler è il seguente:
void openBrowserButton_Click(object sender, RoutedEventArgs e) { frob = conn.AuthGetFrob(); // Richiesta di autenticazione a flickr.com string loginLink = conn.AuthCalcUrl(frob, AuthLevel.Write); System.Diagnostics.Process.Start(loginLink); openBrowserButton.IsEnabled = false; closeWindowButton.IsEnabled = true; }
Ovvero: dalla connessione ottengo il frob, apro il browser e disabilito opportunamente il bottone, in modo tale che l’utente possa cliccare sull’altro. Il secondo event-handler è il seguente:
void closeWindowButton_Click(object sender, RoutedEventArgs e) { // Dopo aver autenticato l'applicazione Auth auth = conn.AuthGetToken(frob); token = auth.Token; // Mi loggo a flickr.com con l'account conn = new Flickr(apiKey, sharedKey, token); this.Close(); }
Ovvero: mi connetto a Flickr con il token che consente autorizzazioni più elevate rispetto a prima e poi, molto semplicemente, la window viene chiusa.
L’esecuzione continua sull’altra window, MainWindow: ne parleremo più nel dettaglio la prossima volta.