2014-10-10 7 views
0

내 목표는 DatePickerPage를 사용자 정의하고 phone.codeplex.com (Windows Phone Toolkit DatePickerPage)에서 xaml 및 cs를 복사하여 내 자신을 생성하는 것입니다. 복사 DatePicker 사용자 정의

나는 소스에 표시된 것과 동일한 방식으로 작동 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는 보호 수준으로 인해 액세스 할 수 없다고 말합니다.

나는이 데이터 소스를 얻는 방법을 모른다.

도움 주셔서 감사합니다.

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

좋아, 이제 작동합니다. Microsoft.Phone.Controls.Toolkit에서 DateTimePickers 폴더에서 Windows Phone Toolkit CodePlex

  • 가서 얻을 파일 : 자신의 날짜 선택기를 정의하려는 사람들을 위해, 여기 단계입니다. DatePickerPage.xaml, DatePickerPage.xaml.cs, DateTimePickerPageBase.cs, DataSource.cs를 가져옵니다. 선택한 이름
  • 이름 바꾸기 DatePickerPage.xaml 당신이 얻을 모든 파일에서
  • , 호출하지 않는, 개인 네임 스페이스 맞춤 DatePickerPage에서
  • 을에 기본 네임 스페이스를 변경 "프리미티브 : DateTimePickerPageBase을"하지만 함께 DateTimePickerPage 당신의 개인 네임 스페이스
  • 유효성 검사 및 취소 작업을 호출하려면 DateTimePickerPageBase에서 OnDoneButtonClick 및 OnCancelButtonClick 메서드를 Public 메서드로 변환하여 DatePickerPage에서 호출합니다.
    • 그리고 DatePicker의 PickerPageUri를 새로 만든 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.csDataTimePickerPageBase.cs을 복사 한 다음

은 CustomDatepickerPage의 전체 코드입니다 네임 스페이스를 적절하게 변경했습니다. (또한 저는 인턴이라고도하는 왼쪽에서 오른쪽 흐름에 관한 몇 줄을 주석 처리했다고 생각합니다. al 방법).

+0

안녕하세요, 귀하의 답변에 감사드립니다. 네임 스페이스를 개인 네임 스페이스로 변경했거나 Microsoft.Phone.Controls의 기본 네임 스페이스를 변경 했습니까? DataSource 파일을 추가 했으므로 컴파일되지만 DatePicker를 클릭 할 때 추상 클래스 DataSource의 SelectedItem 속성에서 SelectionChanged 이벤트에 대한 예외가 있습니다 (YearDataSource를 DataSource로 변환 할 수 없지만 YearDataSource가 DataSource에서 상속 함).). – GwenGuts

+0

좋아, 내 개인 네임 스페이스에 DateTimePickerPageBase의 네임 스페이스를 변경하면 더 잘 작동합니다 ... 이제이 맞춤식 datepicker에 대한 또 다른 문제가 있습니다. Appbar 버튼에는 기본적으로 연결된 이벤트가 없습니다. 그렇지 않다면 어떻게 통제를해야 하는가? 도움 주셔서 감사합니다 – GwenGuts

관련 문제