如何解决.NET Core7 WPF DatePicker设置波斯文化后的显示异常?
解决WPF .NET Core 7中DatePicker波斯文化显示异常问题
问题分析
当前仅全局指定了波斯文化,但未明确让DatePicker及其内置日历控件绑定波斯日历逻辑,导致日期选择后仍以公历规则解析显示,年份选择器也出现公历内容混淆的情况。
解决方案
1. 修正全局文化配置(App.xaml.cs)
在OnStartup事件中,确保波斯文化实例明确关联波斯日历,覆盖默认的日期格式化规则:
protected override void OnStartup(StartupEventArgs e) { var cultureInfo = new CultureInfo("fa-IR"); // 强制指定日期格式使用波斯日历 cultureInfo.DateTimeFormat.Calendar = new PersianCalendar(); Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; FrameworkElement.LanguageProperty.OverrideMetadata( typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(cultureInfo.IetfLanguageTag))); base.OnStartup(e); }
2. 配置DatePicker的日历与显示规则(XAML)
给DatePicker添加日历样式,明确指定使用波斯日历,并设置合适的日期显示格式:
<!-- 先添加System.Globalization命名空间 --> <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cal="clr-namespace:System.Globalization;assembly=System.Runtime" Title="MainWindow" Height="450" Width="800"> <StackPanel FlowDirection="RightToLeft" VerticalAlignment="Center" Margin="10,0,10,0" Height="209"> <DatePicker SelectedDateFormat="Long"> <DatePicker.CalendarStyle> <Style TargetType="Calendar"> <!-- 绑定波斯日历实例 --> <Setter Property="Calendar" Value="{x:Static cal:PersianCalendar.Instance}"/> </Style> </DatePicker.CalendarStyle> </DatePicker> </StackPanel> </Window>
若需要自定义日期显示格式,可将SelectedDateFormat设为Custom并指定StringFormat:
<DatePicker SelectedDateFormat="Custom" StringFormat="yyyy/MM/dd"> <DatePicker.CalendarStyle> <Style TargetType="Calendar"> <Setter Property="Calendar" Value="{x:Static cal:PersianCalendar.Instance}"/> </Style> </DatePicker.CalendarStyle> </DatePicker>
效果验证
完成配置后:
- 点击DatePicker弹出的日历面板将始终显示波斯历
- 选择日期后,输入框会以波斯数字显示波斯历日期
- 年份选择器将正确展示波斯语的波斯历月份与年份
内容的提问来源于stack exchange,提问作者Mohsen Saleh
相关产品推荐
相关产品推荐

