Blog Stats
  • Posts - 21
  • Articles - 0
  • Comments - 20316
  • Trackbacks - 12

 

Alla costruzione di uno scheduler Silverlight..

Per il progetto su cui sto lavorando è necessario utilizzare e visualizzare uno scheduler con poche funzioni base, che mostri le attività da svolgere nel corso della settimana o del mese. Cercando per la rete mi sono imbatutto esclusivamente in scheduler a pagamento, belli da vedere e strapieni di funzionalità: funzionalità così numerose da essere quasi totalmente inutilizzate in un progetto che necessità giusto del minimo sindacale. La scelta quindi è andata verso la costruzione casalinga di un piccolo scheduler adatto alle mie esigenze.

I passi fondamentali sono essenzialmente due:

  1. costruire un usercontrol che rappresenti il giorno della settimana e che raggruppi tutte le attività di quel giorno (che chiamerò DaySchedulerItem)
  2. gestire i DaySchedulerItem in modo che si dispongano su una Grid opportunamente “ritagliata” in modo corretto.

La prima parte ovviamente viene modellata a seconda delle esigenze che si hanno; per questo esempio ci limitiamo a mostrare il giorno corrente e lo spazio dove verranno inseriti gli appuntamenti.

  1. <UserControl x:Class="SchedulerTest.DaySchedulerItem"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  4.     <Border BorderBrush="Black" Background="White" BorderThickness="1" CornerRadius="1">
  5.         <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
  6.             <TextBlock HorizontalAlignment="Center" TextAlignment="Center" TextWrapping="NoWrap" x:Name="today"/>
  7.             <Path Fill="White" Stretch="Fill" Stroke="Black" Height="1" UseLayoutRounding="False" Data="M0.75,31.75 L41.5,31.75"/>
  8.             <StackPanel x:Name="tasks"/>
  9.         </StackPanel>
  10.     </Border>
  11. </UserControl>

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Documents;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Animation;
  11. using System.Windows.Shapes;
  12.  
  13. namespace SchedulerTest
  14. {
  15.     public partial class DaySchedulerItem : UserControl
  16.     {
  17.         public DaySchedulerItem()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.  
  22.         public DateTime Today
  23.         {
  24.             set
  25.             {
  26.                 this.today.Text = value.Day.ToString();
  27.             }
  28.         }
  29.     }
  30. }

A questo punto basta creare una Grid di 7 colonne(per i giorni della settimana) e di 3 righe: la prima conterrà il testo con il mese che stiamo visualizzando e i pulsanti per scorrere da un mese all’altro, la seconda contiene i giorni della settimana e l’ultima verrà utilizzata per creare il calendario. Avendo già suddiviso lo spazio in 7 colonne, è necessario quindi solo suddividere lo spazio rimanete nel numero esatto di righe per mostrare tutte le settimane presenti e andare a posizionare nella cella corretta i DaySchedulerItem.

  1. private void CreateRow()
  2. {
  3.     int dayCount = 0;
  4.  
  5.     DateTime day = this.Month;
  6.     DateTime nextMonth = day.AddMonths(1);
  7.  
  8.     this.txtDate.Text = String.Format("{0:MMMM yyyy}", day).ToUpper();
  9.  
  10.     int row = 2;
  11.  
  12.     while (day < nextMonth)
  13.     {
  14.         if (day.DayOfWeek == DayOfWeek.Monday && dayCount != 0)
  15.         {
  16.             this.LayoutRoot.RowDefinitions.Add(new RowDefinition());
  17.             row ++;
  18.         }
  19.  
  20.         int column = (int) day.DayOfWeek != 0 ? (int) day.DayOfWeek - 1 : 6;
  21.  
  22.         DaySchedulerItem rct = new DaySchedulerItem();
  23.         rct.Today = day;
  24.         rct.Margin = new Thickness(2);
  25.         Grid.SetColumn(rct, column);
  26.         Grid.SetRow(rct, row);
  27.  
  28.         this.LayoutRoot.Children.Add(rct);
  29.  
  30.         day= day.AddDays(1);
  31.         dayCount++;
  32.     }
  33. }

Il risultato che otteniamo è questo

Calendar

Ovviamente per la costruzione di uno scheduler settimanale l’unica differenze sta nel suddividere le righe in 24 porzioni da 1 ora e posizionare il DaySchedulerItem in modo che occupi la corretta posizione a seconda delle ore in cui le attività dovranno essere svolte.

Aggiornerò prossimamente la solution in modo da aver quantomeno le funzionalità minimale(aggiunta, modifica, rimozione dei task giornalieri) e in un futuro possibilmente una grafica un pò più accattivamente e il drag & drop.

see you in cyberspace..

Sorgente: SchedulerTest.zip

Per controllare gli aggiornamenti sullo sviluppo clicca qui

Technorati Tag: ,

 

 

Copyright © Hanamichi