winforms 在区域设置更改时设置DateTimePicker中的时间格式

k3bvogb1  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(229)

我想将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

将时间从所需格式更改为其他格式的动画

ggazkfy8

ggazkfy81#

更改区域设置时,Thread.CurrentThread.CurrentCulture或(CultureInfo.CurrentCulture)不会 * 自动 * 更新。
您可以调用CultureInfo.ClearCachedData()来重置内部CultureData存储的设置并重新加载 fresh 值。
要在用户设置更改时更新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_SETTINGCHANGE, IntPtr.Zero, Marshal.StringToHGlobalAuto("intl"))
End Sub

SendMessage声明:

<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

相关问题