рд╡реИрдХрд▓реНрдкрд┐рдХ WPF рднрд╛рд╖рд╛ JAML = XAML - XML тАЛтАЛ+ JSON

рдирдпрд╛ рд╕рд╛рд▓ рдпрд╛рд░реНрдб рдореЗрдВ рдЖ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐ рдПрдХреНрд╕рдПрдПрдордПрд▓ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореЗрд░реЗ рд╕рд┐рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЖрдпрд╛ред рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдмрд┐рдирд╛: рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдФрд░ рднрдпрд╛рдирдХ рднрдпрд╛рдирдХ XAML'yu рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ <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 рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░рд┐рд╢реНрддреЗрджрд╛рд░ред



рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ? рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 _={ $: '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}' }] }] } 

рдЬрдм / рдЬрдм рдореИрдВ рднрд╛рд╖рд╛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 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} } } } 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреБрдЦрдж рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛: рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рддреБрд░рдВрдд рдЕрдЪреНрдЫрд╛ рд╣реЛ рдЬрд╛рдПред рдпрд╣ рдПрдХ рдкреНрд░реВрдл-рдЯреВ-рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╣реИ ред рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрд┐ рдирд░реНрдХ рдХреЗ рджреНрд╡рд╛рд░ рдирд╣реАрдВ рдЦреБрд▓реЗрдВрдЧреЗ, рдХрд┐ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдПрдХ рд╕рдордЭрджрд╛рд░ рд╕рдордп рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕рдкреНрддрд╛рд╣ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛ (рд╣рд╛рдБ, рд╣рд╛рдБ, рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдирдП рд╕рд╛рд▓ рдХреА рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рдХреИрд╕реЗ рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ)ред рдХрд▓ рдореИрдВрдиреЗ рдПрдХ рдЧреАрдереВрдм рдкрд░ рдкреНрд░рд▓реЗрдЦрди рд▓рд┐рдЦрд╛ рдерд╛, рдЖрдЬ рдореИрдВ рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ, рд╕рд╛рдиреЗ рдФрд░ рдХрдерд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди, рд▓рд╛рдкрд░рд╡рд╛рд╣реА, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рдардХреЛрдВ рдХреЗ рдЖрдзреЗ рдЖрдзреЗ рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЯреИрдм рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдЖрджрд░реНрд╢рд╡рд╛рджрд┐рдпреЛрдВ рдФрд░ рд╕рдкрдиреЗ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде - рд╣рдо рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЧрдВрджреЗ рдЫреЛрдЯреЗ рд╣рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рддрд┐рд░рд╕реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрд╕реЗ рдЧрд┐рддреБрдм рдХрд╛ рджреМрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред рд░реАрдбрдореА рдФрд░ рд╡рд┐рдХреА рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА: рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣рд╛рдБ рдПрдХ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВред

рд╡рд┐рд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдлрд╝рд╛рдЗрд▓ "_ =" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдбрдореА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рдмрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдФрд░ рдкреНрд░рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ JSON рдирд╣реАрдВ рд╣реИ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, 2013 рдореЗрдВ рднреА, JSON рд╕рдВрдкрд╛рджрдХ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдРрд╕реА рдЪреАрдЬреЗрдВ)ред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ (IntelliSense) рдХреЛ рдЦреЛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ ( рдЯреВрд▓> рд╡рд┐рдХрд▓реНрдк> рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░> рдлрд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди ) рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрдо рд╕реЗ рдХрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдбрд┐рдЯрд░ рд╕реНрддрд░ рдкрд░ рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдФрд░ рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХреНрд╕рдПрдордПрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, JSON рдмрд▓реНрдХрд┐ рд╕реАрдорд┐рдд рд╣реИ: рдЗрд╕рдХреА "рд╡рд╕реНрддреБрдУрдВ" рдореЗрдВ рди рддреЛ "рдкреНрд░рдХрд╛рд░" рд╣реИ рдФрд░ рди рд╣реА "рд╕рд╛рдордЧреНрд░реА" рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ (рдЬреЛ рдХрд┐, XML рдХреЗ рдмрд╛рдж <) рдореЗрдВ рдореМрджреНрд░рд┐рдХ рд╕рдВрдкрддреНрддрд┐ "$" рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдВрддрд░рд┐рдХ (рдЬреЛ XML рдХреЗ рдмреАрдЪ рдмреАрдЪ рд╣реИ) "_" рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдореИрдВ рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХреНрд╕рдПрдПрдордПрд▓
 <Button Visibility="Visible"> <Button.ToolTip> <TextBlock Text="Tool tip text"/> </Button.ToolTip> <TextBlock Text="Button text"/> </Button> 
JAML рдХреА рдирдЬрд╝рд░ рдореЗрдВ
 { $: 'Button', Visibility: 'Visible', Tooltip: { $: 'TextBlock', Text: "Tool tip text" }, _: { $: 'TextBlock', Text: "Button text" } } 

рдореМрджреНрд░рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (x: рдирд╛рдо / x: рдХреБрдВрдЬреА), рджреГрд╢реНрдпрддрд╛ (x: ClassModifier / x: FieldModifier) тАЛтАЛрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА "рдирд┐рд╣рд┐рдд" (TargetType / DataType) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреВрд░реНрдг рд╕рд┐рдВрдЯреИрдХреНрд╕ (рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ - рд╡реИрдХрд▓реНрдкрд┐рдХ):
 [visibility] typeName [identifier [implicit identifier]] 
рдЙрджрд╛рд╣рд░рдг:
 Button Button btnCancel private Button btnCancel DataTemplate {~Button} DataTemplate MyButtonTemplate {~Button} 

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдореМрджреНрд░рд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ "рд╕реНрдкрд╖реНрдЯ" рд╣реИ (рдЕрд░реНрдерд╛рдд, рд╡рд╣ рд╕рдВрдкрддреНрддрд┐ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрд╕рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЯреА рдХреЗ рд▓рд┐рдП IEnumerable <T>, ControlTemplate ControlTemplate рдХреЗ рд▓рд┐рдП)ред

рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

JAML рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд "рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╢реЙрд░реНрдЯрдХрдЯреНрд╕ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рд╢реЙрд░реНрдЯрдХрдЯреНрд╕ рдХреЗ рдореВрд▓ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдХрдо рд╣реИ (рдФрд░, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ):
рдХрдореАрдореВрд▓реНрдп
=
рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░реЗрдВ (рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдВрдбрд░)
@
рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП)
~
рдЯрд╛рдЗрдк рдХрд░реЗрдВ
ref
рдирд╛рдо рд╕реЗ рдЖрдЗрдЯрдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдФрд░ рдЕрдм рдкреВрд░реА рд╕реВрдЪреАред
рдХрдореАрдПрдХ рдХреЙрд▓ рдореЗрдВ, T4 рдПрдХ рдЕрдЯреВрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ ...
{@Key}
{StaticResource Key}
{@=Key}
{DynamicResource Key}
{~TypeName}
{x:Type TypeName}
{static.TypeName.Property}
{x:Static TypeName.Property}
null
{x:Null} (рджреЗрд╢реА JSON рдкреНрд░рдХрд╛рд░)
{tpl.Property}
{TemplateBinding Property}
{=PropertyPath}
{Binding PropertyPath}
{=}
{Binding}
{=ref.controlName.PropertyPath}
{Binding PropertyPath, ElementName=controlName}
{=this.PropertyPath}
{Binding PropertyPath, RelativeSource={RelativeSource Self}}
{=tpl.PropertyPath}
{Binding PropertyPath, RelativeSource={RelativeSource TemplatedParent}}
{=~TypeName.PropertyPath}
{Binding PropertyPath, RelativeSource={RelativeSource AncestorType=TypeName}}
{=@{...}.PropertyPath}
{Binding PropertyPath, Source={...}}
{= ${=Prop1} + 42 + ${=Prop2} }
<Binding> рдпрд╛ <MultiBinding> (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
рдЖрдк рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднрд╛рд╡реЛрдВ рдХреЛ рдкрддрд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: {= ref.controlName.PropertyPath } (рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдордд рдХрд░реЛ: рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреНрд░реИрдЪ рдЗрдВрдбреЗрдХреНрд╕рдСрдлрд╝ рдХреЗ рд╕рд╛рде рд╣рд╛рдереА рдХреА рддрд░рд╣ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдорд┐рд╢реНрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ System.Xaml gutted guts рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡реА рд╣реИ)ред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЕрдм рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдЖрдк C # рдореЗрдВ рднрд╛рд╡ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд┐рдд рдмрд╣реБ-рдмрдВрдзрди (рдпрд╛ рдмрдВрдзрди, рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЙрдк-рдмрдВрдзрди рд╣реИ) рдХреЗ рдЙрдк-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛрд╖реНрдардХ ${...} рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИрдВред рджреГрд╢реНрдпреЛрдВ рдХреЗ рдкреАрдЫреЗ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ IValueConverter рдФрд░ IMultiValueConverter рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЖрдорддреМрд░ рдкрд░ рдЖрдк рдмрд┐рдирд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд░реНрдзрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, DependencyProperty.UnsetValue рд▓рд┐рдП рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЪреЗрдХ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдБрдЪреЛред рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдорд╛рди рд╣реИ IsMouseOver == IsMouseDirectlyOver :
 {= (bool)${=this.IsMouseOver} == (bool)${=this.IsMouseDirectlyOver} } 
рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд XAML рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
 <MultiBinding Converter="{x:Static my:MainWin._jaml_MainWindowConverter1}"> <Binding Path="IsMouseOver" RelativeSource="{RelativeSource Mode=Self}" /> <Binding Path="IsMouseDirectlyOver" RelativeSource="{RelativeSource Mode=Self}" /> </MultiBinding> 

рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рд╕реЗ C # рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдирд┐рдпрдорд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдХрд╛рдо рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕ рдХреА рдЬреЛрдбрд╝реА рдХреЛ рдЪреЗрдХ рдХрд░рдирд╛ред рджрд░рдЕрд╕рд▓, рдЕрдВрддрд┐рдо рдЙрдк-рдмрдВрдзрди рдХреЗ рдмрд╛рдж рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдкрдХреЛ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдк ${} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 {= string.Format("Visibility = {0}, Name = {1}", ${=this.Visibility}, param) ${}, ConverterParameter={@Name} } 
рдпрджрд┐ рдЖрдк рдХрд░реНрд▓реА рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ (рдЬреИрд╕реЗ string.Format("{{{0}", value) рддреЛ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИрдВ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ - рдпрд╣рд╛рдВ рдЖрдк рдмрдЪ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рдЖрдк рдпрд╛ рддреЛ рдХреЛрдб-рдкреАрдЫреЗ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рддрд░реНрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдПред

рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдореЗрдВ рдмрд╕рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЙрдиреНрд╣реЗрдВ "рд╕реЗрдЯ" рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
 { $: 'Style MyButtonStyle', set: { Width: 16, Height: 16, Background: 'Red' } } 
рдпрджрд┐ рдЖрдкрдХреЛ Setter.TargetName рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ ref.controlName.PropertyPath рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 set: { 'ref.btnCancel.Width': 16, 'ref.btnCancel.Height': 16, 'ref.btnCancel.Background': 'Red' } 
рдпрджрд┐ рдЖрдк рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрд╖реНрдардХ рд╕реЗ рдШреГрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдбреЙрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдбреЙрд▓рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: ref$controlName$PropertyPath (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдбреЙрд▓рд░ рдФрд░ JSON рдХреЛ рдПрдХ рдкреВрд░реНрдг рд╡рд░реНрдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, JAML рдореЗрдВ рдЗрд╕реЗ рдбреЙрдЯ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╕рдВрд▓рдЧреНрди рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдЯреНрд░рд┐рдЧрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИред рдореВрд▓реНрдп рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдЕрдВрджрд░ рд╣реИ (рд╕реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде)ред рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдЯреНрд░реВ рдХрд╛ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 { $: 'Style CheckBox', on: { '{=this.IsChecked}': { set: { Background: 'Red', Foreground: 'Green' } }, '{= (bool)${=this.IsMouseOver} && (bool)${=this.IsChecked} }': { set: { Background: 'Yellow', Foreground: 'Blue' } } } } 
рд╕рд┐рдВрдЯреИрдХреНрд╕ ref.controlName.PropertyPath рдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреНрд░рд┐рдЧрд░реНрд╕ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЦреИрд░, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, Grid$ рд╕рдВрдкрддреНрддрд┐ - рдпрд╣ рдПрдХ рд╕реЗ рдЪрд╛рд░ рдкреВрд░реНрдгрд╛рдВрдХ рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд╢рдГ Grid.Row, Grid.Column, Grid.RowSpan, Grid.ColumnSpan рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк Grid$='2 3' Grid.Row="2" Grid.Column="3" , рддреЛ рдЖрдкрдХреЛ Grid.Row="2" Grid.Column="3" ред

рд╕рдВрджрд░реНрдн


Json.NET, T4MultiFile рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрди рднрд╛рд░рддреАрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рдирдХреЗ рдХреЛрдб I рдХреЛ System.Xaml рдХреА рд╣рд┐рдореНрдордд рд╕реЗ "рдорд╛рд░реНрдХрдЕрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?

рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХрд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреБрдирд┐рдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд░реВрд░реА рдорд╛рдорд▓реЗ рд╣реИрдВ (рдореИрдВ рдХреБрдЫ рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдКрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреВрдВред рдЗрд╕ рдмреАрдЪ, рдореБрдЭреЗ рджреВрд╕рд░реЛрдВ рдХреА рд░рд╛рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ: рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛? рдЦрд░реЛрдВрдЪ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ?

рд╢рд╛рдпрдж рдЖрдкрдХреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЕрд╕реБрд╡рд┐рдзрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ Resharper рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдПрдХреНрд╕рдПрдПрдордПрд▓ рдПрдХ рд░рд┐рд╡рд╛рд▓реНрд╡рд░ рдЪреВрд╕рдиреЗ рдФрд░ рд╕реНрдореИрдХ рдХреЗ рд╕рд╛рде рдкреБрди: рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, WPF рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдЫрд╣ рд╕рд╛рд▓ рдмрд╛рдж, рд░рд┐рд╕рд░реНрдкрд░ рдиреЗ DataContext рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдХрд╛рдо рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдпрджрд┐ рдЫрд╣ рд╕рд╛рд▓ рд╕рднреА рдкрдХреНрд╖реЛрдВ рд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ XAML рдореЗрдВ рдЪрд▓реЗ рдЧрдП, рддреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдордкрдВрдереА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдЖрдк рдЗрд╕рдХрд╛ рд╕рдкрдирд╛ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╢рд╛рдпрдж, рдХреБрдЫ рднреА рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЛ JAML рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди XAML рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рджреЗрдЦреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЕрднреА рднреА рдмреЗрд╣рддрд░ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░? рдЖрдкрдХреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХреИрд╕рд╛ рд▓рдЧрд╛?

Source: https://habr.com/ru/post/In165943/


All Articles