【发布时间】: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