在区域设置更改时格式化 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 当系统中 某事 时设置已更改。
这些通知有些 通用 (阅读有关它的文档),但您可以通过检查 WParamLParam 值大致了解发生了什么变化。

在您的表单中重写 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 消息发送给 您自己 ,并按照说明设置 WParamLParam,这样您就可以更新和格式化 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