XAML не скомпилируется, но без сообщения об ошибке, если пользовательский объект является первым ресурсом, за которым сразу следует ресурс x: Array
Я нахожу эту проблему очень странной, возможно, ошибка XAML / Visual Studio. Я надеюсь, что кто-то еще посчитает это менее странным и объяснит, почему то, что я делаю, неправильно, и / или лучший обходной путь, чем просто объявление ресурсов в другом порядке.
У меня есть этот простой XAML:
<Window x:Class="TestSOAskArrayXaml.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:TestSOAskArrayXaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:A x:Key="a1"/>
<x:Array x:Key="listBoxItems" Type="{x:Type system:Double}">
<system:Double>0.25</system:Double>
</x:Array>
</Window.Resources>
<Grid/>
</Window>
Когда я пытаюсь скомпилировать проект, я получаю следующую ошибку:
1> ... MainWindow.xaml.cs (25,13,25,32): ошибка CS0103: имя InitializeComponent не существует в текущем контексте
Я понимаю значение ошибки, но не понимаю, почему это происходит. XAML выглядит нормально, нет ошибок при его компиляции, но по какой-то причине автоматически сгенерированный файл .g.i.cs, гдеInitializeComponent()
обычно помещается не создается и не используется (т. е. даже если файл существует из предыдущей успешной компиляции, он все еще не скомпилирован в сборку).
Если я просто поменяю порядок ресурсов, все будет работать нормально:
<Window.Resources>
<x:Array x:Key="listBoxItems" Type="{x:Type system:Double}">
<system:Double>0.25</system:Double>
</x:Array>
<local:A x:Key="a1"/>
</Window.Resources>
Дополнительная информация:
A
любой класс в моем проекте. Для целей этого теста он был объявлен какclass A { }
то есть пустой класс, но я впервые столкнулся с этой проблемой, помещая экземпляры конвертера в ресурсы.Если я использую встроенный тип вместоA
например,<system:String x:Key="a1">Some string</system:String>
, ошибки не бывает.Если я помещаю объект встроенного типа в качестве ресурса между пользовательским типомA
объект и мой объект ресурса массива,тоже отлично работает!Другими словами, кажется, что наличие одного или нескольких определяемых пользователем типизированных объектов в качестве первых элементов ресурса, за которыми сразу следует объект массива, приводит к сбою компиляции. Другие комбинации, кажется, работают просто отлично.
Может кто-нибудь объяснить, почему это ожидаемое поведение (и что я должен делать, чтобы избежать его, кроме перестановки моих ресурсов), или подтвердить, что я не совсем сумасшедший, думая, что это ошибка в процессе сборки XAML?
Редактировать:
Учитывая вероятность того, что это настоящая ошибка, я пошел дальше и открыл отчет об ошибке подключения здесь:https://connect.microsoft.com/VisualStudio/feedback/details/1441123/xaml-fails-to-compile-without-error-if-user-defined-object-is-first-resource-and-followed-immediately- по-X-массив-ресурс
Смотрите также связанный / похожий вопрос переполнения стека:Имя InitializeComponent не существует в текущем контексте: странное поведение
Изменить № 2:
WPF обновил отчет Connect (см. Ссылку выше), заявив, что исправление ошибки будет выпущено в следующей версии .NET:
Написал Сачин [MSFT] 9.03.2016 в 15:53
Команда WPF рассмотрела эту проблему и исправила ее в следующей версии .NET. Мы благодарим вас за отзыв и считаем, что этот вопрос решен - команда WPF