【问题标题】:Copy DatePicker For Customization复制 DatePicker 进行自定义
【发布时间】:2014-10-10 15:21:24
【问题描述】:

我的目标是自定义一个 DatePickerPage,通过从 phone.codeplex.com (Windows Phone Toolkit DatePickerPage) 复制 xaml 和 cs 创建我自己的。

我创建了一个名为 CustomDatepickerPage 的类,它的工作方式与源代码中指示的方式相同,但是当我必须设置 LoopingSelectors 数据源时,我的类的构造函数出现了问题:

     public CustomDatepickerPage()
        {
            InitializeComponent();

            // Hook up the data sources
            PrimarySelector.DataSource = new YearDataSource();
            SecondarySelector.DataSource = new MonthDataSource();
            TertiarySelector.DataSource = new DayDataSource();

            InitializeDateTimePickerPage(PrimarySelector, SecondarySelector, TertiarySelector);
        }

事实上,我无法初始化 3 个 DataSource,Visual Studio 告诉我由于保护级别,我无法访问。

我不知道如何获取这些数据源。

感谢您的帮助。

这是 CustomDatepickerPage 的完整代码:

XAML:

    <primitives:DateTimePickerPageBase
    x:Class="MyNamespace.CustomDatepickerPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True"
    xmlns:primitives="clr-namespace:Microsoft.Phone.Controls.Primitives;assembly=Microsoft.Phone.Controls.Toolkit"
    xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit">
    <primitives:DateTimePickerPageBase.Resources>
        <controls:DateTimePickerResources x:Key="DateTimePickerResources"/>
        <ExponentialEase x:Key="Ease" EasingMode="EaseIn"/>
    </primitives:DateTimePickerPageBase.Resources>

    <Grid Background="{StaticResource PhoneChromeBrush}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisibilityStates">
                <VisualState x:Name="Open">
                    <Storyboard>
                        <DoubleAnimation
                            Storyboard.TargetName="PlaneProjection"
                            Storyboard.TargetProperty="RotationX"
                            From="-50"
                            To="0"
                            Duration="0:0:0.2"/>
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="Closed">
                    <Storyboard>
                        <DoubleAnimation
                            Storyboard.TargetName="PlaneProjection"
                            Storyboard.TargetProperty="RotationX"
                            To="90"
                            Duration="0:0:0.2"
                            EasingFunction="{StaticResource Ease}"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Grid.Projection>
            <PlaneProjection x:Name="PlaneProjection"/>
        </Grid.Projection>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <!-- SystemTray placeholder -->
        <Rectangle
            x:Name="SystemTrayPlaceholder"
            Grid.Row="0"
            Height="32"/>
        <!-- Title -->
        <TextBlock
            x:Name="HeaderTitle"
            Grid.Row="1"
            Text="{Binding DatePickerTitle, Source={StaticResource DateTimePickerResources}}"
            FontFamily="{StaticResource PhoneFontFamilySemiBold}"
            FontSize="{StaticResource PhoneFontSizeMedium}"
            Foreground="{StaticResource PhoneForegroundBrush}"
            Margin="24,16,24,24"/>
        <!-- LoopingSelectors -->
        <Grid
            Grid.Row="2"
            HorizontalAlignment="Center">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <primitives:LoopingSelector
                x:Name="SecondarySelector"
                Grid.Column="0"
                Width="148"
                ItemSize="148,148"
                ItemMargin="6">
                <primitives:LoopingSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Left"
                            VerticalAlignment="Bottom"
                            Margin="6">
                            <TextBlock
                                Text="{Binding MonthNumber}"
                                FontSize="54"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="0,-8"/>
                            <TextBlock
                                Text="{Binding MonthName}"
                                FontSize="20"
                                FontFamily="{StaticResource PhoneFontFamilyNormal}"
                                Margin="0,-2"/>
                        </StackPanel>
                    </DataTemplate>
                </primitives:LoopingSelector.ItemTemplate>
            </primitives:LoopingSelector>
            <primitives:LoopingSelector
                x:Name="TertiarySelector"
                Grid.Column="1"
                Width="148"
                ItemSize="148,148"
                ItemMargin="6">
                <primitives:LoopingSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Left"
                            VerticalAlignment="Bottom"
                            Margin="6">
                            <TextBlock
                                Text="{Binding DayNumber}"
                                FontSize="54"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="0,-8"/>
                            <TextBlock
                                Text="{Binding DayName}"
                                FontSize="20"
                                FontFamily="{StaticResource PhoneFontFamilyNormal}"
                                Margin="0,-2"/>
                        </StackPanel>
                    </DataTemplate>
                </primitives:LoopingSelector.ItemTemplate>
            </primitives:LoopingSelector>
            <primitives:LoopingSelector
                Grid.Column="2"
                x:Name="PrimarySelector"
                Width="148"
                ItemSize="148,148"
                ItemMargin="6">
                <primitives:LoopingSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Left"
                            VerticalAlignment="Bottom"
                            Margin="6">
                            <TextBlock
                                Text="{Binding YearNumber}"
                                FontSize="54"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="0,-8"/>
                            <TextBlock
                                Text=" "
                                FontSize="20"
                                FontFamily="{StaticResource PhoneFontFamilyNormal}"
                                Margin="0,-2"/>
                        </StackPanel>
                    </DataTemplate>
                </primitives:LoopingSelector.ItemTemplate>
            </primitives:LoopingSelector>
        </Grid>
    </Grid>

    <primitives:DateTimePickerPageBase.ApplicationBar>
        <shell:ApplicationBar IsVisible="True">
            <!--
            Due to platform restrictions, ApplicationBarIconButton.IconUri content can not come from the
            Microsoft.Phone.Controls.Toolkit assembly, so it is up to the application developer to ensure
            these resources are placed in the right location and marked as Build Action=Content. For
            convenience, platform-consistent images are included with the Toolkit installer.

            Note: ApplicationBarIconButton.Text automatically comes from the Microsoft.Phone.Controls.Toolkit
            resources (where it can be localized).
            -->
            <shell:ApplicationBarIconButton
                IconUri="/Toolkit.Content/ApplicationBar.Check.png"
                Text="DONE"/>
            <shell:ApplicationBarIconButton
                IconUri="/Toolkit.Content/ApplicationBar.Cancel.png"
                Text="CANCEL"/>
        </shell:ApplicationBar>
    </primitives:DateTimePickerPageBase.ApplicationBar>
</primitives:DateTimePickerPageBase>

CS:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using System.Globalization;
using Microsoft.Phone.Controls.Primitives;

namespace MyNamespace
{
    public partial class CustomDatepickerPage : DateTimePickerPageBase
    {
       /// <summary>
        /// Initializes a new instance of the DatePickerPage control.
        /// </summary>
        public CustomDatepickerPage()
        {
            InitializeComponent();

            // Hook up the data sources
            PrimarySelector.DataSource = new YearDataSource();
            SecondarySelector.DataSource = new MonthDataSource();
            TertiarySelector.DataSource = new DayDataSource();

            InitializeDateTimePickerPage(PrimarySelector, SecondarySelector, TertiarySelector);
        }

        /// <summary>
        /// Gets a sequence of LoopingSelector parts ordered according to culture string for date/time formatting.
        /// </summary>
        /// <returns>LoopingSelectors ordered by culture-specific priority.</returns>
        protected override IEnumerable<LoopingSelector> GetSelectorsOrderedByCulturePattern()
        {
            string pattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern.ToUpperInvariant();

            //if (DateTimePickerBase.DateShouldFlowRTL())
            //{
            //    char[] reversedPattern = pattern.ToCharArray();
            //    Array.Reverse(reversedPattern);
            //    pattern = new string(reversedPattern);
            //}

            return GetSelectorsOrderedByCulturePattern(
                pattern,
                new char[] { 'Y', 'M', 'D' },
                new LoopingSelector[] { PrimarySelector, SecondarySelector, TertiarySelector });
        }

        /// <summary>
        /// Handles changes to the page's Orientation property.
        /// </summary>
        /// <param name="e">Event arguments.</param>
        protected override void OnOrientationChanged(OrientationChangedEventArgs e)
        {
            if (null == e)
            {
                throw new ArgumentNullException("e");
            }

            base.OnOrientationChanged(e);
            SystemTrayPlaceholder.Visibility = (0 != (PageOrientation.Portrait & e.Orientation)) ?
                Visibility.Visible :
                Visibility.Collapsed;
        }

        /// <summary>
        /// Sets the selectors and title flow direction.
        /// </summary>
        /// <param name="flowDirection">Flow direction to set.</param>
        public override void SetFlowDirection(FlowDirection flowDirection)
        {
            HeaderTitle.FlowDirection = flowDirection;

            PrimarySelector.FlowDirection = flowDirection;
            SecondarySelector.FlowDirection = flowDirection;
            TertiarySelector.FlowDirection = flowDirection;
        }
    }
}

【问题讨论】:

    标签: c# xaml datepicker customization windows-phone-8.1


    【解决方案1】:

    要自定义 DataPickerPage,我还必须将 DataSource.csDataTimePickerPageBase.cs 复制到我的项目中并适当地更改命名空间(我想我还注释掉了一些关于从左到右的流程也称为一些内部方法的行)。

    【讨论】:

    • 您好,感谢您的回答。您是否将命名空间更改为您的个人命名空间,还是让 Microsoft.Phone.Controls 默认命名空间?因为我添加了 DataSource 文件,所以它编译但是当我单击我的 DatePicker 时,我在抽象类 DataSource 的属性 SelectedItem 中的 SelectionChanged 事件上有一个异常(不能将 YearDataSource 转换为 DataSource,但 YearDataSource 继承自 DataSource ...)。
    • 好吧,如果我将 DateTimePickerPageBase 的命名空间更改为我的个人命名空间,效果会更好......我现在这个自定义日期选择器有另一个问题,appbar 按钮默认没有附加事件?如果不是,它应该如何在控件上工作?感谢您的帮助
    【解决方案2】:

    好的,现在可以了。对于那些想要自定义自己的日期选择器的人,以下是步骤:

    • 转到Windows Phone Toolkit CodePlex,并从 Microsoft.Phone.Controls.Toolkit 中的 DateTimePickers 文件夹中获取文件。抓取 DatePickerPage.xaml、DatePickerPage.xaml.cs、DateTimePickerPageBase.cs、DataSource.cs。
    • 将 DatePickerPage.xaml 重命名为您选择的名称
    • 在您获得的所有文件中,将默认命名空间更改为您的个人命名空间
    • 在您的自定义 DatePickerPage 中,不要调用“primitives:DateTimePickerPageBase”,而是使用您的个人命名空间调用 DateTimePickerPage
    • 为了调用验证和取消操作,在 DateTimePickerPageBase 中将 OnDoneButtonClick 和 OnCancelButtonClick 方法转换为公共方法,以便从 DatePickerPage 调用它们。
      • 然后,将 DatePicker 中的 PickerPageUri 更改为新创建的 DatePickerPage。

    还有“瞧”:)

    感谢lisp您的宝贵贡献!

    【讨论】:

    • 谢谢 GwenGuts。我真的需要这个控件(用于 WP8.1 WinRT),但我不能让它工作。你有一个工作的例子吗?您的解决方案真的适用于 WP8.1 WinRT 吗? (或者它是一个 WP8.1 Silverlight 应用程序?)
    • @JohnCroneh 嗨,它适用于 WP8.1 Silverlight 应用程序。你到底是什么问题?
    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多