在Windows.Foundation.IReference`1 <windows.foundation.datetime>中使用UWP CalendarDatePicker结果

时间:2018-01-04 16:56:18

标签: c++ xaml uwp

这可能是愚蠢的,因为我正在学习UWP,并且我想尝试制作一个使用CalendarDatePicker的工具,但是我不能让它显示在框中输入的日期。

XAML

<TextBlock x:Name="dateOutput"/>
<CalendarDatePicker x:Name="OrderDate" DateChanged="ChangeOrderDate"/>

C ++

void OrderService::MainPage::ChangeOrderDate(Windows::UI::Xaml::Controls::CalendarDatePicker^ sender, Windows::UI::Xaml::Controls::CalendarDatePickerDateChangedEventArgs^ args)
{

dateOutput->Text = OrderDate->Date->Value.ToString();

}

当我运行此代码时,我可以选择一个日期,但显示的内容如下:

  

Windows.Foundation.IReference`1 Windows.Foundation.DateTime&gt;

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

Textblock实际显示的是DateTime.Value.ValueType,而不是DateTime.Value的实际值。

Windows.Foundation.IReference是一个隐藏的界面,在.NET中显示为Nullable<T>,在C ++ / CX中显示为Platform::IBox,以及您尝试访问的.Value属性,是同一界面实现的一部分。

  

ValueType :: ToString方法重写Object :: ToString方法   并提供ToString方法的默认实现   价值类型。 (值类型是struct关键字定义的类型   C#

DateTime是一个值类型,这就是为什么:: ToString()被ValueType :: ToString重写

您是否可以尝试重载toString,还包括一个参数,指示Date值的所需格式输出,例如“dddd dd MMMM”?

答案 1 :(得分:0)

对于CalendarDatePickerDateTime值,C ++ / CX使用Windows::Foundation::DateTime结构。详情请参阅DateTime and Calendar values。 直接调用ToString()将返回该类型,因为您可以查看@AndréB的回复。

我们可能需要根据DateTime结构的备注来获取要转换的DateTime.UniversalTime值:

  

要将UniversalTime转换为SYSTEMTIME,请使用ULARGE_INTEGER将int64值转换为FILETIME,然后使用FileTimeToSystemTime获取SYSTEMTIME。

但您可以在UWP应用中使用DateTimeFormatter课程格式化DataTime进行展示。有关如何操作的详细信息,请参阅this articlethis sample。例如:

void CCalendar::MainPage::ChangeOrderDate(Windows::UI::Xaml::Controls::CalendarDatePicker^ sender, Windows::UI::Xaml::Controls::CalendarDatePickerDateChangedEventArgs^ args)
{ 
    DateTime current = OrderDate->Date->Value; 
    Array<DateTimeFormatter^> ^dateFormatters = {
        ref new DateTimeFormatter("shortdate"),
        ref new DateTimeFormatter("longdate"),
        ref new DateTimeFormatter("shorttime"),
        ref new DateTimeFormatter("longtime")
    };
    String^ results = ""; 
    // Generate the results.
    for (auto formatter : dateFormatters)
    {
        // Perform the actual formatting. 
        results = results + formatter->Template + ": " + formatter->Format(current) + "\n";
    }
    dateOutput->Text = results;  
}