2015-11-30 8 views
0

Прошу прощения, если заголовок немного смущен, но я действительно не знаю, как кратко описать эту проблему. У меня есть приложение windows wpf, которое отлично работает в Windows 8 и 10, но в Windows 7 происходит сбой при загрузке основного интерфейса. Исключением заявка была retunring заключалась в следующем:WPF в Windows 7: GetCultureInfo в ValueConverter, вызывающий исключение StaticResourceExtension для параметра Provide Value

Обеспечить значение на «System.Windows.StaticResourceExtension» бросил исключение. StackTrace: в System.Windows.Markup.WpfXamlLoader.Load (XamlReader XamlReader, IXamlObjectWriterFactory writerFactory, булева skipJournaledProperties, rootObject Объект, XamlObjectWriterSettings настройки, Ури BaseUri) при System.Windows.Markup.WpfXamlLoader.LoadBaml (XamlReader XamlReader, Boolean skipJournaledProperties, объект rootObject, XamlAccessLevel AccessLevel, Ури BaseUri) в System.Windows.Markup.XamlReader.LoadBaml (поток Stream, ParserContext ParserContext, родительский объект, булева closeStream) в System.Windows.Application.LoadBamlStreamWithSyncInfo (поток поток, ParserContext pc) в System.Windows.Application.LoadComponent (Uri resourceLocator, Boolean bSkipJournaledProperties) в System.Windows.Application.DoStartup() в System.Windows.Application. < .ctor> b__1 (Object не используется) на System.Windows.Threading.ExceptionWrapper.InternalRealCall (делегат обратного вызова, объект арг, Int32 numArgs) на MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (Объект источника, метод делегата, арг Object, Int32 numArgs, делегат catchHandler)

Google сказал мне, что проблема может быть порядок, в котором я определил некоторые статические ресурсы (Provide value on 'System.Windows.StaticResourceExtension) в моем файле XAML. На самом деле у меня есть некоторые DataTemplate определены как статические ресурсы в теге Window.Resources, но, как сказал, что пост, они определены в правильном порядке и Window.Resources тег является первым потомком окна тега:

<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 я использую некоторые ValueConverters, и после некоторых попыток выяснилось, что именно 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, и я исправил проблему, но я хотел бы знать, почему это исключение уволено и почему оно только происходит в Windows 7. Разве xaml разбирается по-разному в Windows 7? Являются ли данные CultureInfo загружен позднее в окне 7?

Заранее спасибо за любой ответ :)

ответ

2

В Windows 7 в CultureInfo.GetCultureInfo("en-en") бросает CultureNotFoundException. Попробуйте использовать просто en или облачную культуру, такую ​​как en-US.Однако, при преобразовании в и из строки, я бы использовать CultureInfo.InvariantCulture

Смотреть доступные имена культуры здесь: http://www.csharp-examples.net/culture-names/

+0

я не заметил, я использовал unexisting культуру! Вероятно, на окнах 8 и 10, когда это происходит, оно возвращается к InvariantCulture, но в Windows 7 это не так. Во всяком случае, инвариантCulture исправил проблему! Я думаю, что исключение, которое он стрелял, было следствием исключения CultureNotFoundException. Спасибо большое :) – Eux