На дворе наступал Новый год, а из головы никак не выходила мысль, что XAML может быть лучше. И, чтобы ему быть лучше, ему нужно перестать быть. Так родилась затея написать альтернативу кошмарному и ужасному XAML'ю: без <Setter.Value>
, без {Binding Path=Name, RelativeSource={RelativeSource AncestorType={x:Type Button}}, Converter={StaticResource Converter}}
, без FirstValueEqualsToSecondValueOrThirdValueEqualsNullConverter
, без <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions>
, без <MultiDataTrigger> <MultiDataTrigger.Triggers> <DataTrigger> <DataTrigger.Binding> <MultiDataBinding>...
, без xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
, без всего этого барахла, от написания которого в десятый раз возникают позывы нежно погладить компьютер табуретом и вспоминаются далёкие индусские родственники разработчиков WPF.
Приветствуем: JAML = XAML − XML + JSON
Фичи:
- Тёплый ламповый синтаксис JSON без кавычек вместо дьявольских уголовых скобок XML.
- Краткий и вменяемый синтаксис для markup extensions: километровые один-раз-написал-потом-читать-страшно-байндинги
{Binding Path=Name, RelativeSource={RelativeSource AncestorType={x:Type Button}}, Converter={StaticResource Converter}}
превращаются в почти присваивания {= ~Button.Name, Converter={@Converter} }.
- Кошерные выражения на C# на замену некошерным конвертерам:
{= ${=Property1} == ${=Property2} || ${=Property3} == null }
.
- Смерть «элементной» записи свойств —
<Setter.Value>
уходят в небытие.
- Зубодробительное повторение повторений объявляется устаревшим: если куда-то можно положить только
ColumnDefinition
, не надо повторять это десять раз.
- Сеттеры и триггеры перестают быть многобуквенными сериализованными костылями: сеттеры выглядят как присваивание свойств, триггеры выглядят как условия.
- Смерть дублированию десяти «clr-namespace» с указанием имён соборок и прочей нечисти.
Звучит классно? А выглядит оно так:
_={
$: 'Window root',
Resources: [{
$: 'Style MyButtonStyle Button',
set: {
Background: 'Red', Foreground: 'Green'
},
on: {
'{=this.IsMouseOver}': {set: {
Background: 'Yellow', Foreground: 'Blue'
}}
}
}],
_: [{
$: 'Grid',
RowDefinitions: [ { Height: '*' } ],
ColumnDefinitions: [ { Width: '*' } ],
_: [{
$: 'Button btnPressMe', Content: 'Press me!', Style: '{@MyButtonStyle}'
}]
}]
}
Читать полностью »