在区域设置更改时格式化 DateTimePicker 中的时间
Format Time in a DateTimePicker as Region settings change
我想将 DateTimePicker 的时间格式化为 24 小时。
我用了下面的代码,时间居然改成了24小时
现在的问题是,当设备使用阿拉伯语区域或英语区域时,日期格式会出现不良形状。
我希望无论设备的区域如何不同,日期的方向都不会改变。
我希望日期的方向是小时、分钟和 AM/PM 如图所示,而不考虑时区。
我的代码:
If Thread.CurrentThread.CurrentCulture.DisplayName.Contains("arab".ToLower) Then
ROSYUPDATE_F.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom
ROSYUPDATE_F.DateTimePicker.CustomFormat = "HH:mm tt"
Else
ROSYUPDATE_F.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom
ROSYUPDATE_F.DateTimePicker.CustomFormat = " tt mm:HH"
End If
根据所需格式更改时间的动画
当您更改区域设置时,Thread.CurrentThread.CurrentCulture
或 (CultureInfo.CurrentCulture
) 不会自动 更新。
您可以调用 CultureInfo.ClearCachedData() 重置内部 CultureData
存储的设置并重新加载 新鲜 值。
要在用户设置更改时更新您的UI,您可以处理系统在这些设置更改时发送的通知。
确认这些通知的一种简单方法是处理 WM_SETTINGCHANGE 消息,该消息发送到所有顶级 Windows 当系统中 某事 时设置已更改。
这些通知有些 通用 (阅读有关它的文档),但您可以通过检查 WParam
和 LParam
值大致了解发生了什么变化。
在您的表单中重写 WndProc
以处理 WM_SETTINGCHANGE
条消息。
当你得到一个时,验证哪些设置已更改并根据此信息采取行动。
在这种情况下,当区域(用户)设置更改时,WParam
设置为 0
并且 LParam
指向一个字符串 "intl"
。
然后,如果语言是 RTL(或非特定的阿拉伯语 - 你用 CultureInfo.GetCultureInfo("AR")
得到的),设置你的自定义格式,否则你可以设置默认的 ShortTimePattern
,或其他。
(假设 DateTimePicker 控件命名为 DateTimePicker1
)
Private Const WM_SETTINGCHANGE As Integer = &H1A
Protected Overrides Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case WM_SETTINGCHANGE
Dim lparmSetting = Marshal.PtrToStringAuto(m.LParam)
If m.WParam.ToInt32() = 0 AndAlso lparmSetting.Equals("intl") Then
CultureInfo.CurrentCulture.ClearCachedData()
DateTimePicker1.CustomFormat = If(CultureInfo.CurrentCulture.TextInfo.IsRightToLeft,
"tt mm:hh", CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern)
End If
End Select
MyBase.WndProc(m)
End Sub
中学:
由于您的自定义格式 不完全标准 ,您在首次加载表单时可能会有不同的行为,具体取决于您的应用所在计算机的当前区域设置 运行 .
您可以将 WM_SETTINGCHANGE
消息发送给 您自己 ,并按照说明设置 WParam
和 LParam
,这样您就可以更新和格式化 DateTimePicker 在启动时自动。
在Form.Load
(或OnLoad()
或OnShown()
或OnHandleCreated()
)中,您可以添加:
Imports System.Runtime.InteropServices
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
SendMessage(Me.Handle, WM_WININICHANGE, IntPtr.Zero, Marshal.StringToHGlobalAuto("intl"))
End Sub
发送消息声明:
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
Friend Shared Function SendMessage(hWnd As IntPtr, uMsg As Integer, wParam As IntPtr, lParam As IntPtr) As Integer
End Function
我想将 DateTimePicker 的时间格式化为 24 小时。
我用了下面的代码,时间居然改成了24小时
现在的问题是,当设备使用阿拉伯语区域或英语区域时,日期格式会出现不良形状。
我希望无论设备的区域如何不同,日期的方向都不会改变。
我希望日期的方向是小时、分钟和 AM/PM 如图所示,而不考虑时区。
我的代码:
If Thread.CurrentThread.CurrentCulture.DisplayName.Contains("arab".ToLower) Then
ROSYUPDATE_F.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom
ROSYUPDATE_F.DateTimePicker.CustomFormat = "HH:mm tt"
Else
ROSYUPDATE_F.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom
ROSYUPDATE_F.DateTimePicker.CustomFormat = " tt mm:HH"
End If
根据所需格式更改时间的动画
当您更改区域设置时,Thread.CurrentThread.CurrentCulture
或 (CultureInfo.CurrentCulture
) 不会自动 更新。
您可以调用 CultureInfo.ClearCachedData() 重置内部 CultureData
存储的设置并重新加载 新鲜 值。
要在用户设置更改时更新您的UI,您可以处理系统在这些设置更改时发送的通知。
确认这些通知的一种简单方法是处理 WM_SETTINGCHANGE 消息,该消息发送到所有顶级 Windows 当系统中 某事 时设置已更改。
这些通知有些 通用 (阅读有关它的文档),但您可以通过检查 WParam
和 LParam
值大致了解发生了什么变化。
在您的表单中重写 WndProc
以处理 WM_SETTINGCHANGE
条消息。
当你得到一个时,验证哪些设置已更改并根据此信息采取行动。
在这种情况下,当区域(用户)设置更改时,WParam
设置为 0
并且 LParam
指向一个字符串 "intl"
。
然后,如果语言是 RTL(或非特定的阿拉伯语 - 你用 CultureInfo.GetCultureInfo("AR")
得到的),设置你的自定义格式,否则你可以设置默认的 ShortTimePattern
,或其他。
(假设 DateTimePicker 控件命名为 DateTimePicker1
)
Private Const WM_SETTINGCHANGE As Integer = &H1A
Protected Overrides Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case WM_SETTINGCHANGE
Dim lparmSetting = Marshal.PtrToStringAuto(m.LParam)
If m.WParam.ToInt32() = 0 AndAlso lparmSetting.Equals("intl") Then
CultureInfo.CurrentCulture.ClearCachedData()
DateTimePicker1.CustomFormat = If(CultureInfo.CurrentCulture.TextInfo.IsRightToLeft,
"tt mm:hh", CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern)
End If
End Select
MyBase.WndProc(m)
End Sub
中学:
由于您的自定义格式 不完全标准 ,您在首次加载表单时可能会有不同的行为,具体取决于您的应用所在计算机的当前区域设置 运行 .
您可以将 WM_SETTINGCHANGE
消息发送给 您自己 ,并按照说明设置 WParam
和 LParam
,这样您就可以更新和格式化 DateTimePicker 在启动时自动。
在Form.Load
(或OnLoad()
或OnShown()
或OnHandleCreated()
)中,您可以添加:
Imports System.Runtime.InteropServices
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
SendMessage(Me.Handle, WM_WININICHANGE, IntPtr.Zero, Marshal.StringToHGlobalAuto("intl"))
End Sub
发送消息声明:
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
Friend Shared Function SendMessage(hWnd As IntPtr, uMsg As Integer, wParam As IntPtr, lParam As IntPtr) As Integer
End Function