愚蠢的,因为我刚刚学习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>
任何帮助将不胜感激。
文本块上实际显示的是DateTime.Value.ValueType
,而不是 DateTime.Value 的实际值。
Windows.Foundation.IReference
是一个隐藏接口,在 .NET 中显示为Nullable<T>
,在 C++/CX 中显示为Platform::IBox
,并且您尝试访问.Value
属性是同一接口实现的一部分。
方法覆盖 Object::ToString 方法 并提供 ToString 方法的默认实现 值类型。(值类型是由 struct 关键字定义的类型 C#
DateTime 是一种值类型,这就是为什么 ::ToString(( 被 ValueType::ToString 覆盖的原因
您可以尝试重载 toString 吗,还包括一个参数,指示您的日期值所需的格式输出是什么,例如"dddd dd MMMM"?
对于CalendarDatePicker
的DateTime
值,C++/CX 使用Windows::Foundation::DateTime
结构。详细信息请参考日期时间和日历值。直接调用 ToString()
将返回类型,因此您可以检查 @André B 的回复。
我们可能需要根据日期时间结构的备注获取要转换的DateTime.UniversalTime
值:
若要将 UniversalTime 转换为 SYSTEMTIME,请使用 ULARGE_INTEGER 将 int64 值转换为 FILETIME,然后使用 FileTimeToSystemTime 获取 SYSTEMTIME。
但是,你可以只使用 UWP 应用中DateTimeFormatter
类来格式化DataTime
以进行显示。有关如何执行操作的详细信息,请参阅本文和此示例。例如:
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;
}