WPF: рдПрдХ рдЖрдЗрдХрди рдФрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП 4 рд╡рд┐рдХрд▓реНрдк

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

рдРрд╕рд╛ рдХреИрд╕реЗ? рдЦреИрд░, рдХреНрдпрд╛ рдмрдЯрди рдореЗрдВ рдХреЛрдИ рдЫрд╡рд┐ рдЧреБрдг рдирд╣реАрдВ рд╣реИ? рдЖрдк рдордЬрд╛рдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣реИ рдирд╛?

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

рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореБрдЭреЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЗрд╕ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ (рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ) рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВрдиреЗ рд╕рднреА Google рдХреЛ "XAML рдмрдЯрди рд╡рд┐рде рдЗрдореЗрдЬ", "WPF рдмрдЯрди рдЗрдореЗрдЬ рдЯреЗрдХреНрд╕реНрдЯ", рдЗрддреНрдпрд╛рджрд┐ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рд╕рддрд╛рдпрд╛ред

рд╕рдореАрдХреНрд╖рд╛ рдХрд┐рдП рдЧрдП рджрд░реНрдЬрдиреЛрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмреАрдЪ, рд╕реНрдкрд╖реНрдЯ (рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ) рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╡рд╛рд▓реЗ рджреЛрдиреЛрдВ рд╕реНрдкрд╖реНрдЯ рдереЗред

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

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <!-- Resource dictionary entries should be defined here. --> <Path x:Key="IconTriangle" x:Shared="False" Stretch="Uniform" Data="M50.25,133.5 L49.75,158.25 76,147.25 z" Fill="Black" Stroke="Black"/> </ResourceDictionary> 

рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЖрдЗрдХрди рдХреЗ рд╕рд╛рде рдмрдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред

рдкрд╣рд▓рд╛ рдФрд░ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╕рд╛рдордЧреНрд░реА рдмрдЯрди рдХреЛ рд╕реАрдзреЗ рдлреЙрд░реНрдо рдХреЛрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдирд╛ рд╣реИ

  <Button HorizontalAlignment="Center" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal"> <ContentControl Width="16" Height="16" Margin="4" Content="{StaticResource IconTriangle}"/> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">Button</TextBlock> </StackPanel> </Button> 


рдЦреИрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рд╣реИред рдПрдХ рдмрдЯрди рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рдЖрдЗрдХрди рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрдВрджрд░ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓рд┐рд╢ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд▓реНрдж рд╣реА рдирд┐рд░рд╛рд╢ рд╣реЛрдВрдЧреЗред рдФрд░ рдпрд╣рд╛рдБ рдХреНрдпреЛрдВ рд╣реИ: рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╢реИрд▓реА рд╕реЗрдЯрд┐рдВрдЧ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдирдХрд▓ рдХрд░рдХреЗ XAML рд╕реВрдЬрди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред 10 рдмрдЯрди - 10 рд╕рдорд╛рди рд╡рд┐рд╡рд░рдгред "рдЪрд▓реЛ рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рдмрдЯрди рдкрд░ рдкрд╛рда рдХреЛ рд░рдВрдЧ рджреЗрдВ" рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрджрд▓рд╛рд╡ рдПрдХ рдердХрд╛рдК рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдлрд╝реЙрд░реНрдо рдХреА рдЕрдзрд┐рдХ рд╕реВрдЬрди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдмрдЯрди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ

рдФрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ "рдЕрдкрдирд╛ рдмрдЯрди рд▓рд╛рдареА рдХреЗ рд╕рд╛рде рдФрд░ рдЖрдк рдЦреБрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдФрд░ рдХреНрдпрд╛ рд╣реИ"?
рд╣рдо рдмрдЯрди рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ ContentControl рдХреЗ рд▓рд┐рдП DependencyProperty рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЗрдХрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА XAML рдлреЙрд░реНрдо рд╕реЗ рд╕реЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ (рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛, рд╡рд╣рд╛рдВ рдкрдврд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛), рд▓реЗрдХрд┐рди рдореИрдВ minuses рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ - рдмрдЯрди рдХреА рд╕рд╛рдордЧреНрд░реА рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╕реА # рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рд╕реЗ рд╣рдореЗрдВ рдмрд╣реБрдд рд╕реА рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЧрдВрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рддреАрд╕рд░рд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ UserControl рдмрдирд╛рдирд╛ рд╣реИред

рдПрдХ UserControl рдмрдирд╛рдПрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдмрдЯрди рд▓рдЧрд╛рддреЗ рд╣реИрдВред UserControl рдореЗрдВ, рдПрдХ DependencyProperty рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо ContentControl рдХреЗ рд▓рд┐рдП рдЖрдЗрдХрди рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдмрдЯрди рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдзрд┐рдХрддрдо рдЕрдирд╛рдбрд╝реАрдкрди рдХреЗ рд▓рд┐рдП рдкрджрдХ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рд╡рд╣ рдкрд┐рдЫрд▓реЗ рддрд░реАрдХреЛрдВ рдХреА рд▓рдЧрднрдЧ рд╕рднреА рдХрдорд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХрдИ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдлреЙрд░реНрдо рдХреЛрдб рдореЗрдВ, рд╣рдо рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрдЯрди рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рд╣рдо рд╕рднреА рдЧреБрдгреЛрдВ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВред рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд▓рдбрд╝ рд░рд╣реЗ рдереЗред

рдЪреМрдерд╛ рддрд░реАрдХрд╛ - рд╕рдВрд▓рдЧреНрди

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

рддреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рд╕рд╛ред рдпрд╣ рд╕рдВрд▓рдЧреНрдирдХ рдХреНрдпрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ XAML рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдЯреИрдЪ рдХрд┐рдП рдЧрдП рдЧреБрдгреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП Grid.Column рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗрдЯ рдХреАред
рдЕрдЧрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╣реЗрдВ - рддреЛ рдЗрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рд▓рд┐рдирдХ рд╕реЗред рдЖрдк рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдХрд┐рд╕реА рднреА рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдСрдмрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг MSDN рд╕реЗ):

 public class AquariumObject { public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached( "IsBubbleSource", typeof(Boolean), typeof(AquariumObject), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender) ); public static void SetIsBubbleSource(UIElement element, Boolean value) { element.SetValue(IsBubbleSourceProperty, value); } public static Boolean GetIsBubbleSource(UIElement element) { return (Boolean)element.GetValue(IsBubbleSourceProperty); } } 


рдпрд╣ рдХреЛрдб IsBubleSource рдЧреБрдг рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдХрд┐рд╕реА рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рдмрдЯрди , рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 <Button AquariumObject.IsBubbleSource="True">Button</Button> 

рдЗрд╕ рдХреЛрдб рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП IsBubbleSource рд╕рдВрдкрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ SetIsBubbleSource рд╡рд┐рдзрд┐ рдкрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ , рдЬреЛ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдХреНрд░рдорд╢рдГ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рд╣рдо GetIsBubbleSource рд╡рд┐рдзрд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдмрд╕ рд╕реЗрдЯ рдФрд░ рдЧреЗрдЯ рдирд╛рдо рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ, рдмрд╛рдХреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╣реИред

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрддрдирд╛ рдХрдо рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдмрдЯрди рд╣реА рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рд╕реЗ рди рддреЛ рдЧрд░реНрдо рд╣реИ рдФрд░ рди рд╣реА рдардВрдбрд╛ рд╣реИ - рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрд▓рдЧ рдореВрд▓реНрдп рдХрд╛ рднрдВрдбрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реЗрдЯ рдФрд░ рдкреВрдЫрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдк SetIsBubbleSource рдФрд░ GetIsBubbleSource рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЯреНрд░рд┐рдХреА рд▓реЙрдЬрд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдмрдЯрди рдкрд░ рдПрдХ рддрддреНрд╡ рдбрд╛рд▓реЗрдВрдЧреЗ , рдЗрд╕рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣реА рд╣реИ

рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ реи
рдореВрд▓ рдореЗрдВ, рд▓реЗрдЦрдХ EyeCandy рд╡рд░реНрдЧ рдирд╛рдо рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо - рдирд╛рдорд╕реНрдерд╛рди Ext рдФрд░ рд╡рд░реНрдЧ рдирд╛рдо E рдХреЛ рдорд╛рдл рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо WPF рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рдореНрди рд╡рд░реНрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Ext { public class E { public static readonly DependencyProperty IconProperty; static E() { var metadata = new FrameworkPropertyMetadata(null); IconProperty = DependencyProperty.RegisterAttached("Icon", typeof(FrameworkElement), typeof(E), metadata); } public static FrameworkElement GetIcon(DependencyObject obj) { return (FrameworkElement)obj.GetValue(IconProperty); } public static void SetIcon(DependencyObject obj, FrameworkElement value) { obj.SetValue(IconProperty, value); } } } 

рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╣рдордиреЗ рдирд▓ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдВрд▓рдЧреНрди рдЖрдЗрдХрди рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ред

рдЕрдм рд╣рдорд╛рд░реЗ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдБред рдореИрдВ "рдХреНрдпрд╛ рдкреИрдЯрд░реНрди рд╣реИрдВ рдФрд░ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ" рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ - рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИ - рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Styles.xaml рдирд╛рдо рдХреЗ рд╕рд╛рде рд░рд┐рд╕реЛрд░реНрд╕рдмреЙрдбреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдпрджрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрднреА рддрдХ рдХреЛрдИ рд╕реНрдЯрд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"> <Style x:Key="ButtonFocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <!-- Resource dictionary entries should be defined here. --> <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0"> <GradientStop Color="#F3F3F3" Offset="0"/> <GradientStop Color="#EBEBEB" Offset="0.5"/> <GradientStop Color="#DDDDDD" Offset="0.5"/> <GradientStop Color="#CDCDCD" Offset="1"/> </LinearGradientBrush> <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/> <Style TargetType="{x:Type Button}"> <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Padding" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"/> <VisualState x:Name="MouseOver"/> <VisualState x:Name="Pressed"/> <VisualState x:Name="Disabled"> <Storyboard> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="IconContent"> <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <StackPanel> <ContentControl Content="{StaticResource IconTriangle}" Width="16" Height="16" x:Name="IconContent" Margin="4" RenderTransformOrigin="0.5,0.5" IsEnabled="{Binding IsEnabled, ElementName=Chrome}"> <ContentControl.Effect> <DropShadowEffect Opacity="0" BlurRadius="2"/> </ContentControl.Effect> <ContentControl.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform/> </TransformGroup> </ContentControl.RenderTransform> </ContentControl> <TextBlock x:Name="textBlock" Margin="4" TextWrapping="Wrap" Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center"/> </StackPanel> </Microsoft_Windows_Themes:ButtonChrome> <ControlTemplate.Triggers> <Trigger Property="IsKeyboardFocused" Value="true"> <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/> </Trigger> <Trigger Property="ToggleButton.IsChecked" Value="true"> <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="#ADADAD"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> 

рдпрд╣ рд╕рдВрд╕рд╛рдзрдирдкреНрд░рд╛рдкреНрддрд┐ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдмрдЯрди рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ WPF рдмрдЯрди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА StackPanel рд╣реИ , рдЬрд┐рд╕рдореЗрдВ ContentControl рдФрд░ TextBlock рд╢рд╛рдорд┐рд▓ рд╣реИрдВ , рдЕрд░реНрдерд╛рддреНред рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдЖрдЗрдХрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ - рдпрджрд┐ рдмрдЯрди рдХреЛ IsEnabled == рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдХрди 50% рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдо рдореЗрдВ 4 рд╕рд░рд▓ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдмрдЯрди рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рда рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░: рд╕рд╛рдордЧреНрд░реА = "рдмрдЯрди 1" ред
рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред


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

рддреЛ, рд╣рдорд╛рд░реА Styles.xaml рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдирд╛рдорд╕реНрдерд╛рди рдЬреЛрдбрд╝реЗрдВ:

 xmlns:Ext="clr-namespace:Ext" 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрдЯрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╣рдо рд╡рд╣ рд▓рд╛рдЗрди рдвреВрдВрдврддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ ContentControl рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИ:
 <ContentControl Content="{StaticResource IconTriangle}" .../> 

рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдмрджрд▓реЗрдВ:
 <ContentControl Content="{Binding (Ext:E.Icon), RelativeSource={RelativeSource TemplatedParent}}" .../> 

рдпрд╣ рд▓рд╛рдЗрди ContentControl рдмрдЯрди рдХреА Ext.E.Icon рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬреЛ Ext.E.Icon рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрдЯрди рдкрд░ рд╣реА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдлреЙрд░реНрдо рдХреЗ рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдмрдЯрди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

 <Button Ext:E.Icon="{StaticResource IconTriangle}" Content=" 1" /> 

рдЖрдЗрдХрди рдХреЗ рд╕рд╛рде рдмрдЯрди рдХрд╛ рдЖрджрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рд╣реИред рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП IconTriangle рдорд╛рди рдХреЛ рдмрджрд▓рдХрд░, рдЖрдк рдмрдЯрдиреЛрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЖрдЗрдХрди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдкрд╣рд▓реЗ рддреАрди рддрд░реАрдХреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕рднреА рдЬрдиреНрдордЬрд╛рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмрдЯрди рдкрд░ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ ( рд╕рд╛рдордЧреНрд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдмрд┐рд▓реНрдХреБрд▓)ред рдмрдЯрди рдХреА рд╕рд╛рдордЧреНрд░реА C # рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЧреБрдг рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдкрд░ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред

рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВ

рдпрджрд┐ рд╣рдо рдЗрд╕ рдмрдЯрди рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ:


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

рд╕реНрд░реЛрдд рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓реЗрдЦ рдореЗрдВ Ext.E рд╡рд░реНрдЧ рдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЛрдВ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рдХреЗрд╡рд▓ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ рдЬреЛ рдмрдЯрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
ContentControl рдХреЗ рдЖрдХрд╛рд░ IconSize рдорд╛рди рд╕реЗ рд╕рдВрдмрджреНрдз рд╣реИрдВ :

 <ContentControl Content="{Binding (Ext:E.Icon), RelativeSource={RelativeSource TemplatedParent}}" Width="{Binding (Ext:E.IconSize), RelativeSource={RelativeSource TemplatedParent}}" Height="{Binding (Ext:E.IconSize), RelativeSource={RelativeSource TemplatedParent}}" .../> 

рд╕реНрдЯреИрдХрдкреИрдирд▓ рдХрд╛ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ ред

 <StackPanel Orientation="{Binding (Ext:E.Orientation), RelativeSource={RelativeSource TemplatedParent}}"> 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрдЯрди рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓реЗ, рдФрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 <Button Ext:E.Icon="{StaticResource IconTriangle}" Ext:E.IconSize="32" Ext:E.Orientation="Horizontal" Content=" 1"/> 

рд╕рд░рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ (рдкрд╣рд▓рд╛ рдмрдЯрди IsEnabled = "False" ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
"
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдБрдЧрд╛

рд╡реЗ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ:
- XAML рдбрд┐рдЬрд╝рд╛рдЗрдирд░ VisualStudio 2010 рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдмрдЯрди рдХреЗ рд╕рдорд╛рди рд╡рд┐рд╡рд░рдг рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ:

- рдмреНрд▓реЗрдВрдб 4 рдФрд░ рд╡рд┐рдЬреБрдЕрд▓рд╕реНрдЯрдбрд┐рдпреЛ 2012 рдмреЗрд╣рддрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА:


рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

UPD: рд▓реЗрдЦ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдмрдЯрди рдкрд░ рдПрдХ рд╣реА рдЖрдЗрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
UPD2: рд╕рдордЭрджрд╛рд░ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж onikiychuka

рд╕реНрд░реЛрдд рдХреЛрдб

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:

WPF рдХрдВрдЯреНрд░реЛрд▓ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ - рдПрдХ рдЗрдореЗрдЬрдмрдЯрди рдмрдирд╛рдиреЗ рдХреЗ 3 рддрд░реАрдХреЗ
blogs.msdn.com/b/knom/archive/2007/10/31/wpf-control-development-3-ways-to-build-an-imagebutton.aspx
WPF рдЫрд╡рд┐ рдмрдЯрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд▓рдЧреНрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
www.hardcodet.net/2009/01/create-wpf-image-button-through-attached-properties
рдХрд╕реНрдЯрдо рдирд┐рд░реНрднрд░рддрд╛ рдЧреБрдг
msdn.microsoft.com/ru-ru/library/ms753358.aspx
рд╕рд┐рдВрдХрдлреНрдпреВрдЬрди рдореЗрдЯреНрд░реЛ рд╕реНрдЯреВрдбрд┐рдпреЛ 2
www.syncfusion.com/downloads/metrostudio

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


All Articles