рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ (рдпрд╛ рд▓рдЧрднрдЧ рд╣рд░ рдХреЛрдИ) рдЬреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ 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"> <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> <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 # рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЧреБрдг рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдкрд░ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред
рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВ
рдпрджрд┐ рд╣рдо рдЗрд╕ рдмрдЯрди рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ:
- рдЖрдЗрдХрди рдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рдпреЛрдЬреНрдп рдирд╣реАрдВ рд╣реИред
- рдмрдЯрди (рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдпрд╛ рдХреНрд╖реИрддрд┐рдЬ) рдХрд╛ рдЙрдиреНрдореБрдЦреАрдХрд░рдг рд╕рдорд╛рдпреЛрдЬреНрдп рдирд╣реАрдВ рд╣реИред
рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╕рдм рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рдЕрд░реНрдерд╛рддреНред рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдмрдЯрди рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдХреНрд▓реЛрдирд┐рдВрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рд░реЗрдХ рдФрд░ рдПрдХ рдкреВрд░реНрдг рдЕрд╕реБрд╡рд┐рдзрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ред
рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
рд╡рд╣рд╛рдВ рджреЛ рдФрд░
рдЕрдЯреИрдЪреНрдбрдкреНрд░реЛрдЯреА рдЬреЛрдбрд╝реЗрдВ
- рдЯрд╛рдЗрдк рдбрдмрд▓ рдХрд╛ IconSize
- рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдкреНрд░рдХрд╛рд░ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди
рд╕реНрд░реЛрдд рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓реЗрдЦ рдореЗрдВ 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.aspxWPF рдЫрд╡рд┐ рдмрдЯрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд▓рдЧреНрди рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
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