Я использую Windows Phone 8.1 DatePicker

По умолчанию дата отображается как месяц / день / год , и я не вижу способа изменить это значение на «правильный» - день / месяц / год .

Вот как я объявляю DatePicker

<DatePicker Name="datePicker" HorizontalAlignment="Center" MonthFormat="{}{month.full}"/>

Отображая это как

enter image description here

В связанной статье msdn я вижу, что могу использовать DateTimeFormatter в сочетании с селекторами ComboBox, но это не вариант для меня.

Является ли это возможным?

5
DaveDev 17 Окт 2014 в 13:59
1
Голос против и без комментариев.... это место превращается в реддит? Что не так с вопросом?
 – 
DaveDev
17 Окт 2014 в 18:10
Лол, не пытайтесь понять троллей с отрицательным голосом. Просто не смотрите в глаза, и они уйдут.
 – 
DotNetRussell
17 Окт 2014 в 21:27
При этом вы пробовали редактировать шаблон DatePicker?
 – 
DotNetRussell
17 Окт 2014 в 21:28
Нет, как я могу отредактировать шаблон?
 – 
DaveDev
18 Окт 2014 в 00:09
1
Не уверен, что вы действительно хотите возиться с настройками информации о культуре. Если вы хотите ДД/ММ/ГГГГ, измените язык/культуру по умолчанию с en-US в Package.appxmanifest. В противном случае вы можете взглянуть на System.Globalization.DateTimeFormatInfo.CurrentInfo вместе с остальными System.Globalization.
 – 
Chubosaurus Software
18 Окт 2014 в 10:15

2 ответа

Лучший ответ

Редактировать шаблон

В Xaml у каждого элемента управления есть стиль, которым вы можете манипулировать, чтобы изменить его внешний вид. Элементы управления также наследуются друг от друга, например, средство выбора даты состоит из кнопки и контейнера содержимого. А кнопка состоит из рамки и контейнера содержимого.

Чтобы обновить стиль выбора даты ... Щелкните правой кнопкой мыши элемент управления выбора даты в Visual Studio в меню, выберите шаблон редактирования, затем нажмите кнопку редактирования копии. В этом примере вы хотите отредактировать стиль шаблона кнопки в шаблоне выбора даты ...

Вам также потребуется создать класс Converter для использования в шаблоне.

Этот ответ сработал для меня Страница с выбором даты ...

<Page
x:Class="DatePikerAnswer.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:DatePikerAnswer"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Page.Resources>
    <!-- Format Converter -->
    <local:DateConverter x:Key="FormatConverter"/>

    <!-- My Button Style-->
    <Thickness x:Key="PhoneBorderThickness">2.5</Thickness>
    <FontWeight x:Key="PhoneButtonFontWeight">Semibold</FontWeight>
    <x:Double x:Key="TextStyleLargeFontSize">18.14</x:Double>
    <x:Double x:Key="PhoneButtonMinHeight">57.5</x:Double>
    <x:Double x:Key="PhoneButtonMinWidth">109</x:Double>
    <Thickness x:Key="PhoneTouchTargetOverhang">0,9.5</Thickness>
    <SolidColorBrush x:Key="ButtonDisabledBackgroundThemeBrush" Color="Transparent"/>
    <Style x:Key="MyButtonStyle" TargetType="Button">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="{ThemeResource PhoneForegroundBrush}"/>
        <Setter Property="Foreground" Value="{ThemeResource PhoneForegroundBrush}"/>
        <Setter Property="BorderThickness" Value="{ThemeResource PhoneBorderThickness}"/>
        <Setter Property="FontFamily" Value="{ThemeResource PhoneFontFamilyNormal}"/>
        <Setter Property="FontWeight" Value="{ThemeResource PhoneButtonFontWeight}"/>
        <Setter Property="FontSize" Value="{ThemeResource TextStyleLargeFontSize}"/>
        <Setter Property="Padding" Value="9.5,0"/>
        <Setter Property="MinHeight" Value="{ThemeResource PhoneButtonMinHeight}"/>
        <Setter Property="MinWidth" Value="{ThemeResource PhoneButtonMinWidth}"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid x:Name="Grid" Background="Transparent">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition From="Pressed" To="PointerOver">
                                        <Storyboard>
                                            <PointerUpThemeAnimation Storyboard.TargetName="Grid"/>
                                        </Storyboard>
                                    </VisualTransition>
                                    <VisualTransition From="PointerOver" To="Normal">
                                        <Storyboard>
                                            <PointerUpThemeAnimation Storyboard.TargetName="Grid"/>
                                        </Storyboard>
                                    </VisualTransition>
                                    <VisualTransition From="Pressed" To="Normal">
                                        <Storyboard>
                                            <PointerUpThemeAnimation Storyboard.TargetName="Grid"/>
                                        </Storyboard>
                                    </VisualTransition>
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="PointerOver"/>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <PointerDownThemeAnimation Storyboard.TargetName="Grid"/>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedForegroundThemeBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedBackgroundThemeBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledForegroundThemeBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="Border">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledBorderThemeBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledBackgroundThemeBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Margin="{ThemeResource PhoneTouchTargetOverhang}">
                            <ContentPresenter x:Name="ContentPresenter"
                                              AutomationProperties.AccessibilityView="Raw" 
                                              ContentTemplate="{TemplateBinding ContentTemplate}" 
                                              Content="{Binding Content,  RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource FormatConverter},ConverterParameter=\{0:dd/MM/yyyy\}}" 
                                              Foreground="{TemplateBinding Foreground}" 
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                              Margin="{TemplateBinding Padding}" 
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!--DatePicker Style-->
    <FontFamily x:Key="PhoneFontFamilyNormal">Segoe WP</FontFamily>
    <x:Double x:Key="ContentControlFontSize">20.26</x:Double>
    <Style x:Key="MyDatePickerStyle1" TargetType="DatePicker">
        <Setter Property="FontFamily" Value="{ThemeResource PhoneFontFamilyNormal}"/>
        <Setter Property="FontSize" Value="{ThemeResource ContentControlFontSize}"/>
        <Setter Property="Foreground" Value="{ThemeResource DatePickerForegroundThemeBrush}"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DatePicker">
                    <StackPanel x:Name="LayoutRoot" Margin="{TemplateBinding Padding}">
                        <ContentPresenter x:Name="HeaderContentPresenter"
                                          ContentTemplate="{TemplateBinding HeaderTemplate}"
                                          Content="{TemplateBinding Header}" Margin="0,0,0,-3" 
                                          Style="{StaticResource HeaderContentPresenterStyle}"/>
                        <Button x:Name="FlyoutButton" 
                                BorderBrush="{TemplateBinding Foreground}" 
                                BorderThickness="2.5" 
                                Background="{TemplateBinding Background}" 
                                Foreground="{TemplateBinding Foreground}" 
                                HorizontalAlignment="Stretch" 
                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                IsEnabled="{TemplateBinding IsEnabled}"
                                Style="{StaticResource MyButtonStyle}"
                                Padding="6.5,0,0,3"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

 <Grid>
  </Grid>
</Page>

Класс преобразователя ...

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Data;

namespace DatePikerAnswer
{
  class DateConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, string language)
    {
       if (value != null)
        {
            ///Convert Class throws exception so can not convert to date time
            string TheCurrentDate = value.ToString();

            string[] Values = TheCurrentDate.Split('/');
            string Day, Month, Year;

            Day = Values[1];
            Month = Values[0];
            Year = Values[2];

            string retvalue = string.Format("{0}/{1}/{2}", Day, Month, Year);
            return retvalue;
       }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
  }
}

Конечный результат ...

enter image description here

5
Stuart Smith 21 Окт 2014 в 03:53
Спасибо за этот исчерпывающий ответ! Я попробую в понедельник утром и дам вам знать, как я справился с этим.
 – 
DaveDev
19 Окт 2014 в 02:00
Я попробовал это - выглядит хорошо, но когда вы нажимаете на дату, выдается ArgumentException с сообщением "Неверный параметр. Цель размещения должна быть в визуальном дереве". Я не могу понять, как это исправить!
 – 
DaveDev
21 Окт 2014 в 18:58
После дальнейшего расследования кажется, что эта ошибка не является ошибкой вашего кода - это ошибка в моем приложении! черт...
 – 
DaveDev
21 Окт 2014 в 19:02
Круто рад, что смог помочь.
 – 
Stuart Smith
21 Окт 2014 в 22:26
Это не будет работать для немецкой локализации и, возможно, некоторых других регионов из-за другого формата данных. Кстати: есть идеи, почему «значение» в конвертере невозможно преобразовать в DateTime?
 – 
Jakub Krampl
28 Янв 2015 в 16:33

Мне нужно было указать дату как «Месяц год», я попробовал несколько решений, о которых думал, но они не работали, немного поискал и, наконец, нашел этот вопрос и ответ StuartSmith. Основываясь на его ответе, я придумал аналогичное решение, которое работает с проблемой локализации, упомянутой в комментарии Кубаскисты.

@StuartSmith Это не будет работать для немецкой локализации и, возможно, некоторых других регионов из-за другого формата данных. Кстати: есть идеи, почему «значение» в конвертере невозможно преобразовать в DateTime?

1- Определите средство выбора даты в xaml, дайте ему имя «FirstDatePicker», а затем из шаблона редактирования конструктора, затем выберите редактировать копию.

Date Picker Style

<DatePicker x:Name="FirstDatePicker" VerticalAlignment="Top" Grid.Row="1" Margin="0,12,0,0"    CalendarIdentifier="GregorianCalendar" DayVisible="False" Padding="0" Style="{StaticResource DatePickerStyle}" RequestedTheme="Light"/>

2- Щелкните правой кнопкой мыши FlyoutButton -> Дополнительные шаблоны -> Редактировать созданный контент -> Редактировать копию.

enter image description here

3- Внутри шаблона содержимого, мы будем напрямую связываться со свойством Date в FirstDatePicker, и с помощью StringFormatConverter вы можете отформатировать дату по своему усмотрению и также переопределить культуру.

<DataTemplate x:Key="DateFormatTemplate">
        <Grid>
            <TextBlock x:Name="textBlock" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Date, ConverterParameter=MMMM yyyy, Converter={StaticResource DateFormatConverter}, ElementName=FirstDatePicker, Mode=OneWay}" VerticalAlignment="Top"/>
        </Grid>
    </DataTemplate>

4- Добавьте StringFormatConverter в решение, не забудьте добавить его в раздел ресурсов страницы.

  public class DateFormatConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert ( object value, Type targetType, object parameter, string language )
    {
        if(!(value is DateTime || value is DateTimeOffset) || parameter == null) return value;
        if(value is DateTime)
        {
            var date = (DateTime)value;
            return date.ToString(parameter.ToString(), CultureInfo.CurrentCulture);
        }
        else
        {
            var date = (DateTimeOffset)value;
            return date.ToString(parameter.ToString(), CultureInfo.CurrentCulture);
        }
    }

    public object ConvertBack ( object value, Type targetType, object parameter, string language )
    {
        throw new NotImplementedException();
    }

    #endregion
}

Примечание. Вы можете изменить "CultureInfo.CurrentCulture" на новую культуру ("ar-EG") в качестве примера или использовать язык, переданный в конвертере.

Наконец, вот что у меня есть в разделе ресурсов на странице

 <converters:DateFormatConverter x:Key="DateFormatConverter"/>
 <x:Double x:Key="ContentControlFontSize">20.26</x:Double>
    <FontWeight x:Key="PhoneButtonFontWeight2">Semibold</FontWeight>
    <DataTemplate x:Key="DateFormatTemplate">
        <Grid>
            <TextBlock x:Name="textBlock" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Date, ConverterParameter=MMMM yyyy, Converter={StaticResource DateFormatConverter}, ElementName=FirstDatePicker, Mode=OneWay}" VerticalAlignment="Top"/>
        </Grid>
    </DataTemplate>
    <Style x:Key="DatePickerStyle" TargetType="DatePicker">
        <Setter Property="FontFamily" Value="{ThemeResource PhoneFontFamilyNormal}"/>
        <Setter Property="FontSize" Value="{ThemeResource ContentControlFontSize}"/>
        <Setter Property="Foreground" Value="{ThemeResource DatePickerForegroundThemeBrush}"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DatePicker">
                    <StackPanel x:Name="LayoutRoot" Margin="{TemplateBinding Padding}">
                        <ContentPresenter x:Name="HeaderContentPresenter" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Margin="0,0,0,-3" Style="{StaticResource HeaderContentPresenterStyle}"/>
                        <Button x:Name="FlyoutButton" BorderBrush="{TemplateBinding Foreground}" BorderThickness="2.5" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" HorizontalAlignment="Stretch" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsEnabled="{TemplateBinding IsEnabled}" Padding="12,10" Margin="0"   ContentTemplate="{StaticResource DateFormatTemplate}"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
1
Ahmed Rashad Mohamed 16 Апр 2015 в 19:38