Windows Phone 8.1 - 每日日历和问题

时间:2014-10-06 13:07:27

标签: xaml calendar windows-runtime pivot windows-phone-8.1

我正在尝试制作日历,我创建了这个:

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;
        }
    }
}

当我改变日子的时候,它运作良好,但我有一个重量级的错误。我将尝试逐步解释它。

  1. 今天是星期一,用户将其更改为前一天。
  2. Pivot的所选项目从4(星期一)变为3(星期日)。
  3. 系统欺骗它必须再生成一个要转动的项目。
  4. 系统生成新项目并将其插入0位置。
  5. Pivot的所选项目从3变为4(现在是星期日)。
  6. Pivot仍显示现在星期六的第3项,并且看起来有一天跳过日历。
  7. 如果有人知道如何修复它,我将非常感激。

    编辑:

    我根据 Nate Diamond 建议进行了更改,现在效果很好:

    在这里,有一个代码:

    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();
            }
        }
    }
    

0 个答案:

没有答案