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:
- costruire un usercontrol che rappresenti il giorno della settimana e che raggruppi tutte le attività di quel giorno (che chiamerò DaySchedulerItem)
- 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.
- <UserControl x:Class="SchedulerTest.DaySchedulerItem"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
- <Border BorderBrush="Black" Background="White" BorderThickness="1" CornerRadius="1">
- <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
- <TextBlock HorizontalAlignment="Center" TextAlignment="Center" TextWrapping="NoWrap" x:Name="today"/>
- <Path Fill="White" Stretch="Fill" Stroke="Black" Height="1" UseLayoutRounding="False" Data="M0.75,31.75 L41.5,31.75"/>
- <StackPanel x:Name="tasks"/>
- </StackPanel>
- </Border>
- </UserControl>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Animation;
- using System.Windows.Shapes;
-
- namespace SchedulerTest
- {
- public partial class DaySchedulerItem : UserControl
- {
- public DaySchedulerItem()
- {
- InitializeComponent();
- }
-
- public DateTime Today
- {
- set
- {
- this.today.Text = value.Day.ToString();
- }
- }
- }
- }
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.
- private void CreateRow()
- {
- int dayCount = 0;
-
- DateTime day = this.Month;
- DateTime nextMonth = day.AddMonths(1);
-
- this.txtDate.Text = String.Format("{0:MMMM yyyy}", day).ToUpper();
-
- int row = 2;
-
- while (day < nextMonth)
- {
- if (day.DayOfWeek == DayOfWeek.Monday && dayCount != 0)
- {
- this.LayoutRoot.RowDefinitions.Add(new RowDefinition());
- row ++;
- }
-
- int column = (int) day.DayOfWeek != 0 ? (int) day.DayOfWeek - 1 : 6;
-
- DaySchedulerItem rct = new DaySchedulerItem();
- rct.Today = day;
- rct.Margin = new Thickness(2);
- Grid.SetColumn(rct, column);
- Grid.SetRow(rct, row);
-
- this.LayoutRoot.Children.Add(rct);
-
- day= day.AddDays(1);
- dayCount++;
- }
- }
Il risultato che otteniamo è questo
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