рдкреНрд░рд┐рдЬрд╝реНрдо рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдЕрдиреБрд░реЛрдз

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

рдмрд╛рддрдЪреАрдд рдЕрдиреБрд░реЛрдз рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛



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

рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдЗрдВрдЯрд░реИрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛



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

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

рдкреНрд░рд┐рдЬреНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА IInteractionRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ InteractionRequest<T> IInteractionRequest InteractionRequest<T> рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред IInteractionRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрд╡реЗрдВрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреГрд╢реНрдп рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред InteractionRequest<T> рд╡рд░реНрдЧ IInteractionRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рддрдЪреАрдд рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрд░реЛрдз рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рдХреЙрд▓рдмреИрдХ рдбреЗрд▓рд┐рдЧреЗрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ IInteractionRequest рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИред

рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХреА рд╢реБрд░реВрдЖрдд


InteractionRequest<T> рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЗ рджреМрд░рд╛рди рд╡реНрдпреВ рдореЙрдбрд▓ рдХреЗ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреЛ рд╡реНрдпреВ рдХреЗ рд╕рд╛рде рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдХрд░рддрд╛ рд╣реИред Raise рд╡рд┐рдзрд┐ рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдПрдХ рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ (рдЬреИрд╕реЗ T ) рдФрд░ рдПрдХ рдХреЙрд▓рдмреИрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рддрдЪреАрдд рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреЛ рдбреЗрдЯрд╛ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрд╕рдХреЗ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рджреГрд╢реНрдп рдореЙрдбрд▓ рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рджреМрд░рд╛рди рд╣реБрдП рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 public interface IInteractionRequest { event EventHandler<InteractionRequestedEventArgs> Raised; } public class InteractionRequest<T> : IInteractionRequest { public event EventHandler<InteractionRequestedEventArgs> Raised; public void Raise(T context, Action<T> callback) { var handler = this.Raised; if (handler != null) { handler( this, new InteractionRequestedEventArgs( context, () => callback(context))); } } } 


рдкреНрд░рд┐рдЬреНрдо рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрджрд░реНрдн рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред Notification рд╡рд░реНрдЧ рд╕рднреА рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗред рдпрд╣ рджреЛ рдЧреБрдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - Title рдФрд░ Content ред рдЖрдорддреМрд░ рдкрд░, рдпрд╣ рд╕рдВрджреЗрд╢ рдПрдХ рддрд░рдлрд╝рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХреЗ рджреМрд░рд╛рди рд╕рдВрджрд░реНрдн рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред

Confirmation рд╡рд░реНрдЧ рдХреЛ Notification рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдПрдХ рддреАрд╕рд░реА рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, Confirmed , рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдпрд╛ рдЗрд╕реЗ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ред Confirmation рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ MessageBox -рд╕реНрдЯрд╛рдЗрд▓ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╣рд╛рдВ / рдирд╛ рдореЗрдВ рдЬрд╡рд╛рдм рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрджрд░реНрдн рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, Notification рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛, рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

InteractionRequest<T> рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд░реАрдб-рдУрдирд▓реА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

 public IInteractionRequest ConfirmCancelInteractionRequest { get { return this.confirmCancelInteractionRequest; } } this.confirmCancelInteractionRequest.Raise( new Confirmation("Are you sure you wish to cancel?"), confirmation => { if (confirmation.Confirmed) { this.NavigateToQuestionnaireList(); } }); } 


рдмрд╛рддрдЪреАрдд рдХреЗ рджреГрд╢реНрдп рд░реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

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

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмреНрд▓реЗрдВрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдорд╛рдирдХ EventTrigger рдЙрдкрдпреЛрдЧ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдВрдЯрд░реИрдХреНрд╢рди рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ EventTrigger рдХрд░рдХреЗ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреНрд░рд┐рдЬрд╝рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ EventTrigger , рдЬрд┐рдиреНрд╣реЗрдВ InteractionRequestTrigger EventTrigger рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ IInteractionRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЙрдкрдпреБрдХреНрдд Raised рдИрд╡реЗрдВрдЯ рд╕реЗ IInteractionRequest рд╣реИред

рдИрд╡реЗрдВрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, InteractionRequestTrigger рдЗрд╕рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд┐рдЬреНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреЙрдкрдЕрдк PopupChildWindowAction рдХреНрд▓рд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдкрдЕрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рдЪрд╛рдЗрд▓реНрдб рд╡рд┐рдВрдбреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХрд╛ DataContext рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред ContentTemplate рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреЙрдкрдЕрдк рд╡рд┐рдВрдбреЛ рд╢реАрд░реНрд╖рдХ рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рдХреЗ Title рдЧреБрдг рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PopupChildWindowAction рдФрд░ PopupChildWindowAction рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 <i:Interaction.Triggers> <prism:InteractionRequestTrigger SourceObject="{Binding ConfirmCancelInteractionRequest}"> <prism:PopupChildWindowAction ContentTemplate="{StaticResource ConfirmWindowTemplate}"/> </prism:InteractionRequestTrigger> </i:Interaction.Triggers> <UserControl.Resources> <DataTemplate x:Key="ConfirmWindowTemplate"> <Grid MinWidth="250" MinHeight="100"> <TextBlock TextWrapping="Wrap" Grid.Row="0" Text="{Binding}"/> </Grid> </DataTemplate> </UserControl.Resources> 


рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреЙрдк-рдЕрдк рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдкреЙрдк-рдЕрдк рдореЗрдВ рдпрд╛ рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рд╕рдВрдкрддреНрддрд┐ рдХреА Content рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕рдВрд╢реЛрдзрд┐рдд рдбреЗрдЯрд╛ рдХреА рдмрдЪрдд рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ OK рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, Confirmed рдХреА Confirmed рд╕рдВрдкрддреНрддрд┐ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рд╣реЛрддреА true ред

рдЕрдиреНрдп рдЗрдВрдЯрд░реИрдХреНрд╢рди рддрдВрддреНрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдЯреНрд░рд┐рдЧрд░реНрд╕ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдЯреНрд░рд┐рдЧрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ InteractionRequestTrigger рдФрд░ PopupChildWindowAction рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд╕реНрдЯрдо рдкреЙрдкрдЕрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдБ



рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░рд┐рдЬрд╝реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА WPF рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреЙрдкрдЕрдк рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдЪреВрдХ рдХреЛ рдФрд░ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдмрд╛рд▓ рдЦрд┐рдбрд╝рдХреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХрд╛ рдПрдХ рд░рд┐рдХреНрдд рдмрдирд╛рдПрдВред

 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:localInter="clr-namespace:PrismNotifications.Notifications" xmlns:inter="clr-namespace:Microsoft.Practices.Prism.Interactivity.InteractionRequest;assembly=Microsoft.Practices.Prism.Interactivity" xmlns:local="clr-namespace:PrismNotifications" x:Class="PrismNotifications.MainWindow" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <local:MainWindowsViewModel /> </Window.DataContext> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <i:Interaction.Triggers> <inter:InteractionRequestTrigger SourceObject="{Binding ShowNotificationInteractionRequest}"> <localInter:ShowChildWindowsAction> <DataTemplate DataType="{x:Type inter:Notification}"> <Grid Width="200" Height="150"> <TextBlock Text="{Binding Content}" /> </Grid> </DataTemplate> </localInter:ShowChildWindowsAction> </inter:InteractionRequestTrigger> </i:Interaction.Triggers> <StackPanel HorizontalAlignment="Right" Margin="10" Grid.Row="1"> <Button Command="{Binding ShowNotificationCommand}"> Show notificaiton windows </Button> </StackPanel> </Grid> </Window> 


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

 using Microsoft.Practices.Prism.Commands; using Microsoft.Practices.Prism.Interactivity.InteractionRequest; using Microsoft.Practices.Prism.ViewModel; namespace PrismNotifications { /// <summary> ///     . /// </summary> public class MainWindowsViewModel : NotificationObject { public MainWindowsViewModel() { ShowNotificationInteractionRequest = new InteractionRequest<Notification>(); ShowNotificationCommand = new DelegateCommand( () => ShowNotificationInteractionRequest.Raise( new Notification { Title = "", Content = "." })); } /// <summary> ///     . /// </summary> public InteractionRequest<Notification> ShowNotificationInteractionRequest { get; private set; } /// <summary> /// ,   <see cref="ShowNotificationInteractionRequest"/>. /// </summary> public DelegateCommand ShowNotificationCommand { get; private set; } } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Raise рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧреБрдг Title рдФрд░ Content рд╕рд╛рде Notification рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ShowNotificationInteractionRequest рдЧреБрдг рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз InteractionRequestTrigger ShowNotificationInteractionRequest рдЯреНрд░рд┐рдЧрд░, рдЬреЛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдЕрдиреБрд░реЛрдз рд╣реИ, Grid рддрддреНрд╡ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдЕрдВрджрд░ ShowChildWindowsAction рдПрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред

 using System.Windows; using System.Windows.Interactivity; using System.Windows.Markup; using Microsoft.Practices.Prism.Interactivity.InteractionRequest; namespace PrismNotifications.Notifications { /// <summary> ///     . /// </summary> [ContentProperty("ContentDataTemplate")] public class ShowChildWindowsAction : TriggerAction<UIElement> { /// <summary> /// ,   . /// </summary> public DataTemplate ContentDataTemplate { get; set; } protected override void Invoke(object parameter) { var args = (InteractionRequestedEventArgs) parameter; } } } 


рдпрд╣ рд╡рд░реНрдЧ TriggerAction<T> рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ TriggerAction<T> , рдЬрд╣рд╛рдВ T рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╕рдВрд▓рдЧреНрди рд╣реЛрддрд╛ рд╣реИред ContentPropertyAttribute рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ ContentPropertyAttribute , ContentPropertyAttribute рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ ContentDataTemplate рд╕рдВрдкрддреНрддрд┐ рдПрдХ рд╕рд╛рдордЧреНрд░реА рдЧреБрдг рд╣реЛрдЧреАред рдЬрдм рдХреЛрдИ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЕрдиреБрд░реЛрдз рд╣реЛрддрд╛ рд╣реИ, рддреЛ Invoke рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджрд░реНрдн рдФрд░ рдХреЙрд▓рдмреИрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ InteractionRequestedEventArgs RequestedEventArgs рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрдм рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЪрд╛рдЗрд▓реНрдб рд╡рд┐рдВрдбреЛ рдХреЛ args.Context.Title рдХреЗ рд╕рд╛рде args.Context.Title рдкреНрд░реЙрдкрд░реНрдЯреА рдФрд░ args.Context.Title рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ (рдпрджрд┐ рдХреЛрдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

  protected override void Invoke(object parameter) { var args = (InteractionRequestedEventArgs) parameter; //    ,  ,    . Window parentWindows = Window.GetWindow(AssociatedObject); //   ,      . var childWindows = new Window { Owner = parentWindows, WindowStyle = WindowStyle.ToolWindow, SizeToContent = SizeToContent.WidthAndHeight, WindowStartupLocation = WindowStartupLocation.CenterOwner, Title = args.Context.Title, Content = args.Context, ContentTemplate = ContentDataTemplate, }; //       . childWindows.Closed += (sender, eventArgs) => { if (args.Callback != null) { args.Callback(); } }; //  . childWindows.ShowDialog(); } 


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдпрд╣ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рдорд┐рд▓рддреА рд╣реИ:



рдкреЙрдкрдЕрдк рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред


WPF рдЖрджрд┐рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдПрдХ рдЕрджреНрднреБрдд рдкреЙрдкрдЕрдк рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдкреЙрдкрдЕрдк рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ: рдЬрдм рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдкреЙрдкрдЕрдк рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рдмрдВрдж рд░рд╛рдЬреНрдп рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреЙрдкрдЕрдк рдХреЛ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдореВрд▓ рддрддреНрд╡ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ Panel рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧ рдореВрд▓ рддрддреНрд╡ рд╣реИ рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдкреЙрдкрдЕрдк рдХреЛ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рдирдпрд╛ Grid рдмрдирд╛рдПрдВ рдФрд░ рдореВрд▓ рддрддреНрд╡ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ, рдореМрдЬреВрджрд╛ рдПрдХ рдХреЛ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВред рдЬрдм рдкреЙрдкрдЕрдк рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд┐рдВрдбреЛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрдВрдЧреЗ, рдФрд░ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдХреЙрд▓рдмреИрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдЕрдирд▓реЙрдХ рдФрд░ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЬрдм рдХреЛрдИ рд╡рд┐рдВрдбреЛ рдЪрд▓рддреА рд╣реИ, рддреЛ рдкреЙрдкрдЕрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреЙрдкрдЕрдк рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк рдЗрд╕рдХреА рд╕рдВрдкрддреНрддрд┐ PopupAnimation = PopupAnimation.Fade рдФрд░ AllowsTransparency = true рдХреЛ рдЗрд╕рдХреЗ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рдФрд░ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 using System; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Interactivity; using System.Windows.Markup; using Microsoft.Practices.Prism.Interactivity.InteractionRequest; namespace PrismNotifications.Notifications { /// <summary> ///     . /// </summary> [ContentProperty("ContentDataTemplate")] public class ShowPopupAction : TriggerAction<UIElement> { private Action _callback; private Popup _popup; private ContentControl _popupContent; private Panel _root; /// <summary> /// ,   . /// </summary> public DataTemplate ContentDataTemplate { get; set; } protected override void OnAttached() { //   . Window window = Window.GetWindow(AssociatedObject); if (window == null) { throw new NullReferenceException("Windows is null."); } // ,     Grid, //   -  . _root = window.Content as Panel; if (_root == null) { _root = new Grid(); _root.Children.Add((UIElement) window.Content); window.Content = _root; } //   . _popupContent = new ContentControl { ContentTemplate = ContentDataTemplate, }; //   ,      . _popup = new Popup { StaysOpen = true, PopupAnimation = PopupAnimation.Fade, AllowsTransparency = true, Placement = PlacementMode.Center, Child = _popupContent, }; _popup.Closed += PopupOnClosed; window.LocationChanged += (sender, a) => UpdatePopupLocation(); _root.Children.Add(_popup); } private void UpdatePopupLocation() { //     , //     . //       . if (!_popup.IsOpen) { return; } const double delta = 0.1; _popup.HorizontalOffset += delta; _popup.HorizontalOffset -= delta; } private void PopupOnClosed(object sender, EventArgs eventArgs) { //          . if (_callback != null) { _callback(); } _root.IsEnabled = true; } protected override void Invoke(object parameter) { var args = (InteractionRequestedEventArgs) parameter; _callback = args.Callback; _popupContent.Content = args.Context; //        . _root.IsEnabled = false; _popup.IsOpen = true; } } } 


MainWindows рдореЗрдВ, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:

  <i:Interaction.Triggers> <inter:InteractionRequestTrigger SourceObject="{Binding ShowNotificationInteractionRequest}"> <localInter:ShowPopupAction ContentDataTemplate="{StaticResource popupTemplate}" /> </inter:InteractionRequestTrigger> </i:Interaction.Triggers> 


рдЕрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд╕рдВрджреЗрд╢ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рдВрд╕рд╛рдзрди рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрд░рдВрдн рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕рдВрд▓рдЧреНрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЛрд╖рдгрд╛ рдХреЛ App.xaml рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:localInter="clr-namespace:Microsoft.Practices.Prism.Interactivity.InteractionRequest;assembly=Microsoft.Practices.Prism.Interactivity" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" x:Class="PrismNotifications.App" StartupUri="MainWindow.xaml"> <Application.Resources> <DataTemplate DataType="{x:Type localInter:Notification}" x:Key="popupTemplate"> <Border Width="200" Height="150" Background="{StaticResource {x:Static SystemColors.WindowBrushKey}}" BorderBrush="{StaticResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" CornerRadius="2" Padding="5"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Text="{Binding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1" /> <Button Content="Close" HorizontalAlignment="Right" Grid.Row="2"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Popup}}" PropertyName="IsOpen" Value="False" /> </i:EventTrigger> </i:Interaction.Triggers> </Button> <TextBlock HorizontalAlignment="Center" Text="{Binding Title}" /> </Grid> </Border> </DataTemplate> </Application.Resources> </Application> 


рд╕рдВрджреЗрд╢ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддрддреНрд╡ рдЯреНрд░реА рдореЗрдВ Popup рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреА IsOpen рд╕рдВрдкрддреНрддрд┐ рдХреЛ false рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдЯреНрд░рд┐рдЧрд░реНрд╕ рдФрд░ рдПрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реЙрд░реНрдо рдХреА рдПрдХ рдкреЙрдк-рдЕрдк рд╡рд┐рдВрдбреЛ рдорд┐рд▓рддреА рд╣реИ:



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

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рд▓реЗрдЦред
рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдХрд╛ рд▓рд┐рдВрдХ

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


All Articles