2014-10-10 2 views
0

Моя цель - настроить DatePickerPage, создавая мои собственные с копированием xaml и cs с телефона.codeplex.com (Windows Phone Toolkit DatePickerPage).Копия DatePicker для настройки

Я создал класс с именем CustomDatepickerPage, который работает точно так же, как указано в источнике, но у меня есть проблема в конструкторе моего класса, когда я должен установить LoopingSelectors DataSources:

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

ответ

0

Итак, теперь он работает. Для тех, кто хочет настроить свой собственный DatePicker, вот шаги:

  • Перейти к Windows Phone Toolkit CodePlex и получить файлы из папки DateTimePickers в Microsoft.Phone.Controls.Toolkit. Захват DatePickerPage.xaml, DatePickerPage.xaml.cs, DateTimePickerPageBase.cs, DataSource.cs.
  • Rename DatePickerPage.xaml к выбранному имени
  • Во всех файлах, которые вы получите, изменить пространство имен по умолчанию для ваших личных пространств имен
  • в пользовательском DatePickerPage, не называют «примитивы: DateTimePickerPageBase», но DateTimePickerPage с вашим личное пространство имен
  • Чтобы вызвать действия проверки и аннулирования, в DateTimePickerPageBase преобразуйте методы OnDoneButtonClick и OnCancelButtonClick в общедоступные методы, чтобы вызвать их из DatePickerPage.
    • И измените PickerPageUri в своем DatePicker на только что созданную DatePickerPage.

И "вуаля" :)

Спасибо lisp за ценный вклад!

+0

Спасибо GwenGuts. Мне действительно нужен этот контроль (** для WP8.1 WinRT **), но я не могу заставить его работать. У вас есть рабочий пример? Действительно ли ваше решение работает в WP8.1 WinRT? (Или это приложение WP8.1 Silverlight?) –

+0

@JohnCroneh Привет, это приложение WP8.1 Silverlight. Какова ваша проблема? – GwenGuts

+0

Проблема заключается в следующем: http://stackoverflow.com/questions/27729182/windows-phone-8-1-winrt-custom-looping-selector –

1

Чтобы настроить DataPickerPage мне пришлось скопировать также DataSource.cs и DataTimePickerPageBase.cs в мой проект и изменили пространства имен соответственно (и я думаю, что я также прокомментировал некоторые строки относительно потока слева направо, которое также называлось некоторым интернетом al method).

+0

Привет, спасибо за ваш ответ. Вы изменили пространства имен на свои личные пространства имен или вы разрешили пространства имен Microsoft.Phone.Controls по умолчанию? Поскольку я добавил файл DataSource, он компилируется, но когда я нажимаю на свой DatePicker, у меня есть исключение в событии SelectionChanged в свойстве SelectedItem абстрактного класса DataSource (невозможно преобразовать YearDataSource в DataSource, но YearDataSource наследует от DataSource ...). – GwenGuts

+0

Хорошо, он работает лучше, если я изменил пространство имен DateTimePickerPageBase на свое личное пространство имен ... У меня есть еще одна проблема для этого пользовательского datepicker, кнопки панели приложений не имеют привязанного к событию события по умолчанию? Как это должно работать на контроле, если нет? Спасибо за вашу помощь – GwenGuts

Смежные вопросы