PowerShell中DateTimePicker控件自定义样式/颜色不生效如何解决
问题核心原因
调用[System.Windows.Forms.Application]::EnableVisualStyles()启用系统视觉样式后,DateTimePicker的大部分颜色属性会被系统主题强制覆盖,这是WinForm控件的原生特性,和你写的配置代码本身无关。
可行的解决方法
- 方法1:禁用视觉样式(简单快速)
直接注释或删除[System.Windows.Forms.Application]::EnableVisualStyles()这行代码即可,你现有的颜色配置就能正常生效,缺点是所有控件都会切换为无主题的经典样式。 - 方法2:自定义绘制控件(保留视觉样式的前提下改色)
给DateTimePicker开启自定义绘制模式,通过绘制事件手动渲染控件样式:# 开启自定义绘制模式 $BillDate.DrawMode = [System.Windows.Forms.DateTimePickerDrawMode]::OwnerDrawFixed # 绑定绘制事件 $BillDate.Add_DrawItem({ param($sender, $e) # 绘制背景 $e.Graphics.FillRectangle([System.Drawing.Brushes]::Red, $e.Bounds) # 绘制文本 $e.Graphics.DrawString($sender.Text, $sender.Font, [System.Drawing.Brushes]::White, $e.Bounds.X, $e.Bounds.Y) }) - 方法3:单独修改下拉日历面板样式
如果只是下拉的日历面板颜色不生效,可以通过反射拿到内部的MonthCalendar实例单独设置样式:$BillDate.Add_DropDown({ $cal = $sender.GetType().GetField("calendar", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance).GetValue($sender) if ($cal -is [System.Windows.Forms.MonthCalendar]) { $cal.TitleBackColor = [System.Drawing.Color]::FromArgb(33,35,50) $cal.TitleForeColor = [System.Drawing.Color]::White $cal.BackColor = [System.Drawing.Color]::FromArgb(33,35,50) $cal.ForeColor = [System.Drawing.Color]::White } })
额外注意点
- 使用RGB自定义颜色时不要直接写字符串,要调用
[System.Drawing.Color]::FromArgb(33,35,50)生成标准颜色对象,避免部分场景下类型识别错误。 - PS Studio调试运行前记得清理缓存,避免旧代码残留导致配置不生效。
内容的提问来源于stack exchange,提问作者DeadLink
相关产品推荐
相关产品推荐

