Windows 7上的WPF:ValueConverter中的GetCultureInfo导致Provide Value

本文关键字:GetCultureInfo 导致 Provide Value 中的 ValueConverter 上的 WPF Windows | 更新日期: 2023-09-27 18:24:59

如果标题有点混乱,我很抱歉,但我真的不知道如何简短地描述这个问题。我有一个wpf windows应用程序,它在windows 8和10中运行良好,但在加载主界面时在windows 7上崩溃。该应用程序返回的例外情况是:

提供"System.Windows.StaticResourceExtension"上的值引发了例外StackTrace:位于System.Windows.Markup.WpfXamlLoader.Load(XamlReader XamlReader,IXamlObjectWriterFactory writerFactory,布尔skipJournaledProperties,对象rootObject,XamlObjectWriterSettings设置,Uri-baseUri)System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader-XamlReader,布尔skipJournaledProperties,对象rootObject,XamlAccessLevelaccessLevel,Uri-baseUri)System.Windows.Markup.XamlReader.LoadBaml(流,ParserContextparserContext、Object父级、布尔closeStream)System.Windows.Application.LoadBamlStreamWithSyncInfo(流流,ParserContext pc)在System.Windows.Application.LoadComponent(UriresourceLocator,布尔值bSkipJournaledProperties)位于的System.Windows.Application.DoStartup()系统。Windows。应用程序。<。ctor>b_1(未使用的对象)System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托callback,Object args,Int32 numArgs)MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象source,Delegate方法,Object args,Int32 numArgs,DelegadecatchHandler)

谷歌告诉我,问题可能是我在xaml文件中定义一些静态资源(在';System.Windows.StaticResourceExtension上提供值)的顺序。事实上,我在Window.resources标签中有一些DataTemplate被定义为静态资源,但正如那篇文章所说,它们是按照正确的顺序定义的,Window.Resourses标签是Window标签的第一个子:

<Window x:Class="FlyMasterSyncGui.Forms.FlightLog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:FlyMasterSyncGui.Forms"
    xmlns:formsUtils="clr-namespace:FlyMasterSyncGui.FormsUtils"
    Title="FlymasterSync" Height="372" Width="608"
    Icon="../Assets/icon.ico"
    WindowStartupLocation="CenterScreen"
    Closed="FlightLog_OnClosed"
    Closing="FlightLog_OnClosing" Loaded="FlightLog_OnLoaded">
<Window.Resources>
    <CollectionViewSource x:Key="groupedFlights" Source="{Binding TracksDb.Entries}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="FlightInfo.Date" Converter="{formsUtils:YearConverter}" />
            <PropertyGroupDescription PropertyName="FlightInfo.Date" Converter="{formsUtils:MonthConverter}" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
    <DataTemplate x:Key="InnerTemplate">
        <Grid Margin="0,10,0,0">
            <Border VerticalAlignment="Bottom" Background="#FF9CA7B4" 
Padding="5,0,0,0"> 
[...]

不过,在这个xaml中,我使用了一些ValueConverter,经过一些尝试,我发现是MonthConverter引发了异常。转换器代码如下:

public class MonthConverter : MarkupExtension, IValueConverter
{
    private MonthConverter _converter;
    public MonthConverter()
    {
    }
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        DateTime d = (DateTime)value;
        //Exception Here
        var monthName = CultureInfo.GetCultureInfo("en-en").DateTimeFormat.GetMonthName(d.Month);                         
        return char.ToUpper(monthName[0]) + monthName.Substring(1);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (_converter == null) _converter = new MonthConverter();
        return _converter;
    }
}

当我调用时调用异常

CultureInfo.GetCultureInfo("en-en").DateTimeFormat.GetMonthName(d.Month);

我真的不明白为什么。目前,我刚刚制作了一个自定义函数,可以将月份编号转换为其名称,因此我不需要调用CultureInfo,我解决了这个问题,但我想知道为什么会触发这个异常,以及为什么它只发生在Windows7上。xaml在Windows7中的解析方式不同吗?CultureInfo数据是否稍后加载到Window 7?

提前感谢您的回复:)

Windows 7上的WPF:ValueConverter中的GetCultureInfo导致Provide Value

在Windows 7中,CultureInfo.GetCultureInfo("en-en")抛出一个CultureNotFoundException。试着简单地使用en或特定区域的文化,如en-US。然而,当转换到字符串和从字符串转换时,我会使用CultureInfo.InvariantCulture

请在此处查看可用的区域性名称:http://www.csharp-examples.net/culture-names/