четверг, октября 16, 2014

Игрушечка-8 или Windows 10

Как всё прогрессивное человечество, скачал и установил на виртуалку то, что все давно ждали – очень универсальную ОС Windows 10. Поудивлялся, что не “9”, но не долго (хозяин – барин, мой рояль, куда хочу, туда и ставлю). Установил из магазина свою программку и решил посмотреть, как использующиеся в ней разные технологии работать будут.
На втором же шаге выяснилось, что одна из SettingsFlyout, использующихся для настроек программы, не желает работать - другие вполне себе работают, а эта молча не показывается вовсе.
После запуска программки на windows 10  под отладчиком на проблемной страничке прямо в конструкторе получаю ошибку с сообщением "XAML parsing failed.". Вот и здрасьте...
Бля!!! Дело оказалось в задании значений для комбобокса:
<x:Int32>50</x:Int32>
<x:Int32>100</x:Int32>
Заменил целые на строки, и всё стало работать:
 <x:String>50</x:String>
<x:String>100</x:String>
Пришёл к выводу, что в дальнейшем такие вещи надёжней делать в коде, хоть в конструкторе XAML и удобней иногда. Мало ли, какие ещё глюки в XAML-парсер добавят. И как оно там будет, когда эту “универсальную” ОСь на телефон поставят…

Игрушечка-7 или Локализация-2

Предыдущая “Локализация” была про нехватку стандартных средств XAML для локализации. Нынешняя – про то, что не всегда можно делать так, как кажется логичным.
У элементов интерфейса есть два атрибута – x:Name="MyControl" и x:Uid="MyControl". Первый используется в коде как имя переменной, обозначающей этот элемент, второй – в ресурсах со строками для локализации как префикс имени нужной строки (напр., MyControl.Text и т.д.). Нигде значения этих атрибутов не пересекаются и, по логике, вполне могут иметь одинаковые значения – удобно же, особенно, когда контролов много, оперировать с одинаковыми именами.
Но у изобретателей XAML-парсеров своя логика… До некоторого уровня сложности (количества нагромождений элементов разметки, методов и свойств объектов в программе) она совпадает с моей – всё компилировалось, загружалось на телефон и десктоп, запускалось, локализовалось и работало. С какого-то момента, запустив программку на эмуляторе телефона, получил сообщение о необработанном исключении при парсинге XAML в методе InitializeComponent(). При этом, естественно (метод-то не мой, хоть и можно Студией залезть) внутри него толком ничего узнать не получается. Сообщается, что ошибка в такой-то позиции такой-то строки. И поди догадайся, что строку надо искать в файле, который генерит препроцессор XAML… Вот тут-то, при разглядывании этого файла, и рождаются подозрения, что атрибутам x:Name и x:Uid нужно обязательно задавать разные значения… И действительно, после изменения одного из них XAML начал успешно парситься.
Где это говорилось про одну ОС на всех устройствах? Пускай бы парcер XAML одинаковый был, это, вроде, попроще…