Прошу прощения, если заголовок немного смущен, но я действительно не знаю, как кратко описать эту проблему. У меня есть приложение 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?
Заранее спасибо за любой ответ :)
я не заметил, я использовал unexisting культуру! Вероятно, на окнах 8 и 10, когда это происходит, оно возвращается к InvariantCulture, но в Windows 7 это не так. Во всяком случае, инвариантCulture исправил проблему! Я думаю, что исключение, которое он стрелял, было следствием исключения CultureNotFoundException. Спасибо большое :) – Eux