Entwickler-Ecke

WPF / Silverlight - Calendar Control -> toggle selected dates


Greenberet - So 26.01.14 12:43
Titel: Calendar Control -> toggle selected dates
Guten Morgen,

ich bin jetzt mal wieder seit längeren dabei mich mit WPF zu spielen.

Für eine Zeitsteuerung muss der User in der Lage sein Feiertage einzutragen.

Das mache ich derzeit mit dem standard Calendar Control. SelectionMode ist auf MultipleRanges und das funktioniert auch soweit.

Allerdings muss man hierführ immer die Strg-Taste gedrückt halten. Ansonsten wird bei einem Klick alles vorherige abgewählt und nur das neueste Aktiv.

Wie bekommt man es am einfachsten hin, dass die Daten bei einem Klick getoggled werden?


Christian S. - So 26.01.14 14:11

Hallo!

Ich hatte an sowas gedacht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
    private void mycalendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
    {
      if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
        return;

      if (e.RemovedItems.Count == 0//vorher war nichts markiert, also auch nichts zu tun
        return;
      else
      {
        var removedItems = e.RemovedItems.Cast<DateTime>().ToArray();
        var addedItems = e.AddedItems.Cast<DateTime>().ToArray(); ;

        var removeItems = addedItems.Where(i => removedItems.Contains(i)).ToArray();  //die Daten, die innerhalb der vorherigen Auswahl lagen, müssen in Wahrheit entfernt werden

        mycalendar.SelectedDatesChanged -= mycalendar_SelectedDatesChanged; //sich selbst nicht wieder aufrufen ...

        foreach (var date in removedItems) //erstmal die Daten, die entfernt wurden, wieder hinzufügen
          if (!mycalendar.SelectedDates.Contains(date))
            mycalendar.SelectedDates.Add(date);

        foreach (var date in removeItems) //die "wirklich" zu entfernenden Items raus
          mycalendar.SelectedDates.Remove(date);

        mycalendar.SelectedDatesChanged += mycalendar_SelectedDatesChanged;
      }
    }

Allerdings funktioniert das noch nicht ganz, insbesondere wenn mehrere Daten ausgewählt sind und dann mehrere Daten getoggelt werden sollen. Kompliziert wird es auch, wenn ein paar der neu ausgewählten Daten in der vorherigen Auswahl lagen und ein paar nicht ;-)

Vielleicht kannst Du daraus ja aber irgendwas funktionierendes bauen :)

Viele Grüße
Christian


Greenberet - Mi 29.01.14 01:18

Vielen Dank schonmal =)

von der Programmlokig ist es eig jetzt genau so wie ich es wollte.

das einzige Problem ist, dass während man mehrere Tage selektiert, die bestehenden nicht angezeigt werden. Sobald man aufhört sind die neuen und alten Werte wieder sichtbar.(sofern diese nicht gelöscht wurden)