0
votes

I was trying to make daily calendar and I create this:

xaml:

<Page
x:Class="Calendar.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Calendar"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Grid>
    <Pivot x:Name="CalendarPivot" Title="Pivot" SelectionChanged="CalendarPivot_SelectionChanged">
    </Pivot>

</Grid>
<Page.BottomAppBar>
    <CommandBar>

        <AppBarButton x:Name="TodayAppBarButton" Label="dziś" Click="TodayAppBarButton_Click">
            <AppBarButton.Icon>
                <FontIcon x:Name="TodayFontIcon" Glyph="" FontSize="10" FontFamily="Segoe WP"/>
            </AppBarButton.Icon>
        </AppBarButton>
        <AppBarButton x:Name="ChooseDateAppBarButton" Label="wybierz" Icon="Calendar" Click="ChooseDateAppBarButton_Click">
            <FlyoutBase.AttachedFlyout>
                <DatePickerFlyout DatePicked="DatePickerFlyout_DatePicked"/>
            </FlyoutBase.AttachedFlyout>
        </AppBarButton>
    </CommandBar>
</Page.BottomAppBar>

c#:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Navigation;

namespace Calendar
{

    public sealed partial class MainPage : Page
    {
        bool pivotClear = false;

        public MainPage()
        {
        this.InitializeComponent();
        }


        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            var monthDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month.abbreviated");
            SetCalendar(DateTimeOffset.Now);
            TodayFontIcon.Glyph = DateTimeOffset.Now.Day + " " + monthDatefmt.Format(DateTimeOffset.Now);
        }

        private void SetCalendar(DateTimeOffset startDate)
        {
            var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
            var dayOfWeekDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("dayofweek.full");
            var dayMonthYearDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("day month year");
            for (int i = -4; i < 5; i++)
            {
                PivotItem pivotItem = new PivotItem();
                DateTimeOffset date = new DateTimeOffset();
                date = startDate.AddDays(i);
                pivotItem.Tag = date.Month + "/" + date.Day + "/" + date.Year;

                if (date.Date == DateTimeOffset.Now.Date)
                {
                    pivotItem.Header = loader.GetString("Today");
                }
                else
                {
                    pivotItem.Header = dayOfWeekDatefmt.Format(date).ToLower();
                }
                CalendarPivot.Items.Add(pivotItem);
            }
            CalendarPivot.SelectedIndex = 4;
            CalendarPivot.Title = dayMonthYearDatefmt.Format(startDate).ToUpper();
        }

        private void CalendarPivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
            Debug.WriteLine("change started" + CalendarPivot.SelectedIndex);
            if (!pivotClear)
            {
                var sdatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("dayofweek.full");
                var dayMonthYearDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("day month year");
                PivotItem selectedPivotItem = CalendarPivot.SelectedItem as PivotItem;
                DateTimeOffset selectedPivotItemDate = new DateTimeOffset();
                selectedPivotItemDate = DateTimeOffset.Parse(selectedPivotItem.Tag as string);

                CalendarPivot.Title = dayMonthYearDatefmt.Format(selectedPivotItemDate).ToUpper();

                PivotItem lastPivotItem = CalendarPivot.Items.Last() as PivotItem;
                DateTimeOffset lastPivotItemDate = new DateTimeOffset();
                lastPivotItemDate = DateTimeOffset.Parse(lastPivotItem.Tag as string);

                if (selectedPivotItemDate.Date >= lastPivotItemDate.Date.AddDays(-3))
                {
                    PivotItem pivotItem = new PivotItem();
                    DateTimeOffset date = new DateTimeOffset();
                    date = lastPivotItemDate.AddDays(1);
                    pivotItem.Tag = date.Month + "/" + date.Day + "/" + date.Year;

                    if (date.Date == DateTimeOffset.Now.Date)
                    {
                        pivotItem.Header = loader.GetString("Today");
                    }
                    else
                    {
                        pivotItem.Header = sdatefmt.Format(date).ToLower();
                    }
                    CalendarPivot.Items.Add(pivotItem);

                }

                PivotItem firstPivotItem = CalendarPivot.Items.First() as PivotItem;
                DateTimeOffset firstPivotItemDate = new DateTimeOffset();
                firstPivotItemDate = DateTimeOffset.Parse(firstPivotItem.Tag as string);

                if (selectedPivotItemDate.Date <= firstPivotItemDate.Date.AddDays(3))
                {
                    PivotItem pivotItem = new PivotItem();
                    DateTimeOffset date = new DateTimeOffset();
                    date = firstPivotItemDate.AddDays(-1);
                    pivotItem.Tag = date.Month + "/" + date.Day + "/" + date.Year;

                    if (date.Date == DateTimeOffset.Now.Date)
                    {
                        pivotItem.Header = "dziś";
                    }
                    else
                    {
                        pivotItem.Header = sdatefmt.Format(date).ToLower();
                    }
                    CalendarPivot.Items.Insert(0, pivotItem);
                }
            }
            Debug.WriteLine("change ended" + CalendarPivot.SelectedIndex);
        }

        private void TodayAppBarButton_Click(object sender, RoutedEventArgs e)
        {
            pivotClear = true;
            CalendarPivot.Items.Clear();
            SetCalendar(DateTimeOffset.Now);
            pivotClear = false;
        }

        private void ChooseDateAppBarButton_Click(object sender, RoutedEventArgs e)
        {
            FlyoutBase.ShowAttachedFlyout((FrameworkElement)sender);
        }

        private void DatePickerFlyout_DatePicked(DatePickerFlyout sender, DatePickedEventArgs args)
        {
            pivotClear = true;
            DateTimeOffset date = args.NewDate;
            CalendarPivot.Items.Clear();
            SetCalendar(date);
            pivotClear = false;
        }
    }
}

It works well when I change days forward, but I have one heavyweight bug in backward way. I will try to explain it in steps.

  1. Today is monday and user changes it to previous day.
  2. Pivot's selected item changes from 4(monday) to 3(sunday) .
  3. System decects that it must generate one more item to pivot.
  4. System generates new item and inserts it in 0 position.
  5. Pivot's selected item changes from 3 to 4(now sunday).
  6. Pivot still shows item 3 which is saturday now, and it's looks like calendar skipped one day.

I would be very grateful if someone knows how to fix it.

EDIT :

I made change based on Nate Diamond suggestion and it works for now well:

Here, have a code:

XAML:

<Page
x:Class="LetsMakeANewCalendar.NewCalendar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:LetsMakeANewCalendar"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Grid>
    <Pivot x:Name="CalendarPivot" Title="" SelectionChanged="CalendarPivot_SelectionChanged">
        <PivotItem x:Name="PivotItem0"/>
        <PivotItem x:Name="PivotItem1"/>
        <PivotItem x:Name="PivotItem2"/>
        <PivotItem x:Name="PivotItem3"/>
        <PivotItem x:Name="PivotItem4"/>
        <PivotItem x:Name="PivotItem5"/>
        <PivotItem x:Name="PivotItem6"/>
    </Pivot>

</Grid>
<Page.BottomAppBar>
    <CommandBar>

        <AppBarButton x:Name="TodayAppBarButton" Label="dziś" Click="TodayAppBarButton_Click">
            <AppBarButton.Icon>
                <FontIcon x:Name="TodayFontIcon" Glyph="" FontSize="10" FontFamily="Segoe WP"/>
            </AppBarButton.Icon>
        </AppBarButton>
        <AppBarButton x:Name="ChooseDateAppBarButton" Label="wybierz" Icon="Calendar" Click="ChooseDateAppBarButton_Click">
            <FlyoutBase.AttachedFlyout>
                <DatePickerFlyout DatePicked="DatePickerFlyout_DatePicked"/>
            </FlyoutBase.AttachedFlyout>
        </AppBarButton>
    </CommandBar>
</Page.BottomAppBar>

C#:

public sealed partial class NewCalendar : Page
{
    int pivotIndex;
    DateTimeOffset previousDate = new DateTimeOffset();

    public NewCalendar()
    {
        this.InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var monthDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month.abbreviated");
        SetCalendar(DateTimeOffset.Now);
        TodayFontIcon.Glyph = DateTimeOffset.Now.Day + " " + monthDatefmt.Format(DateTimeOffset.Now);
    }

    private void SetCalendar(DateTimeOffset startDate)
    {
        var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
        var dayOfWeekDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("dayofweek.full");
        var dayMonthYearDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("day month year");
        int numberOfDay = GetNumberOfDay(startDate);
        int i = 0;
        foreach (PivotItem item in CalendarPivot.Items)
        {
            DateTimeOffset date = new DateTimeOffset();
            date = startDate.AddDays(i - numberOfDay);
            item.Tag = date.Month + "/" + date.Day + "/" + date.Year;

            item.Header = dayOfWeekDatefmt.Format(date).ToLower();
            i++;
        }

        CalendarPivot.SelectedIndex = pivotIndex = numberOfDay;
    }

    private int GetNumberOfDay(DateTimeOffset date)
    {
        int numberOfDay;
        switch (date.DayOfWeek)
        {
            case DayOfWeek.Monday:
                numberOfDay = 0;
                break;
            case DayOfWeek.Tuesday:
                numberOfDay = 1;
                break;
            case DayOfWeek.Wednesday:
                numberOfDay = 2;
                break;
            case DayOfWeek.Thursday:
                numberOfDay = 3;
                break;
            case DayOfWeek.Friday:
                numberOfDay = 4;
                break;
            case DayOfWeek.Saturday:
                numberOfDay = 5;
                break;
            case DayOfWeek.Sunday:
                numberOfDay = 6;
                break;
            default:
                numberOfDay = -1;
                break;
        }
        return numberOfDay;
    }

    private void CalendarPivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var loader = new Windows.ApplicationModel.Resources.ResourceLoader();

        Debug.WriteLine("old pivot index " + pivotIndex);
        Debug.WriteLine("change started " + CalendarPivot.SelectedIndex);
        var dayMonthYearDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("day month year");

        if ((CalendarPivot.SelectedIndex == 6) && (pivotIndex == 0))
        {
            SetCalendar(previousDate.AddDays(-1));
        }
        else if ((CalendarPivot.SelectedIndex == 0) && (pivotIndex == 6))
        {
            SetCalendar(previousDate.AddDays(1));
        }
        PivotItem selectedPivotItem = CalendarPivot.SelectedItem as PivotItem;
        DateTimeOffset selectedPivotItemDate = new DateTimeOffset();
        selectedPivotItemDate = DateTimeOffset.Parse(selectedPivotItem.Tag as string);

        previousDate = selectedPivotItemDate.Date;
        pivotIndex = CalendarPivot.SelectedIndex;
        CalendarPivot.Title = dayMonthYearDatefmt.Format(selectedPivotItemDate).ToUpper();

        if (selectedPivotItemDate.Date == DateTimeOffset.Now.Date)
        {
            CalendarPivot.Title += " - " + loader.GetString("Today").ToUpper();
        }

        Debug.WriteLine("change ended " + CalendarPivot.SelectedIndex);
        Debug.WriteLine("new pivot index " + pivotIndex);
    }

    private void TodayAppBarButton_Click(object sender, RoutedEventArgs e)
    {
        var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
        var dayMonthYearDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("day month year");
        SetCalendar(DateTimeOffset.Now);
        PivotItem selectedPivotItem = CalendarPivot.SelectedItem as PivotItem;
        DateTimeOffset selectedPivotItemDate = new DateTimeOffset();
        selectedPivotItemDate = DateTimeOffset.Parse(selectedPivotItem.Tag as string);

        previousDate = selectedPivotItemDate.Date;
        pivotIndex = CalendarPivot.SelectedIndex;
        CalendarPivot.Title = dayMonthYearDatefmt.Format(selectedPivotItemDate).ToUpper() + " - " + loader.GetString("Today").ToUpper();

    }

    private void ChooseDateAppBarButton_Click(object sender, RoutedEventArgs e)
    {
        FlyoutBase.ShowAttachedFlyout((FrameworkElement)sender);
    }

    private void DatePickerFlyout_DatePicked(DatePickerFlyout sender, DatePickedEventArgs args)
    {
        var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
        var dayMonthYearDatefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("day month year");
        DateTimeOffset date = args.NewDate;
        SetCalendar(date);
        PivotItem selectedPivotItem = CalendarPivot.SelectedItem as PivotItem;
        DateTimeOffset selectedPivotItemDate = new DateTimeOffset();
        selectedPivotItemDate = DateTimeOffset.Parse(selectedPivotItem.Tag as string);

        previousDate = selectedPivotItemDate.Date;
        pivotIndex = CalendarPivot.SelectedIndex;
        CalendarPivot.Title = dayMonthYearDatefmt.Format(selectedPivotItemDate).ToUpper();

        if (selectedPivotItemDate.Date == DateTimeOffset.Now.Date)
        {
            CalendarPivot.Title += " - " + loader.GetString("Today").ToUpper();
        }
    }
}
I think the best solution is that when looking at days of the week, always have 7 pivots. Change the content of the pivot based on a pointer that calculates the changes in current selection (probably a simple integer).Nate Diamond
I think that it works now. Thanks!Vil