рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛:
- рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдзрд┐ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ
- рд╡рд┐рдзрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирдкреБрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдФрд░ рдЙрд╕реА рд╕реНрдерд╛рди рд╕реЗ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИ
рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛: рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдВрдбреЛ рди рдмрдирд╛рдПрдВред
рдпрд╣ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛? рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рдерд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗред
рдирд┐рд░реНрдгрдп
рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд░реНрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреА рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдореИрдВ ShowDialog рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдПрдХ рд▓реЗрдЦ рдХреЗ рдкрд╛рд░ рдЖрдпрд╛ рдерд╛ред рд▓реЗрдЦрдХ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ WPF рдореЗрдВ ShowDialog рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП!
рдЕрдкрдиреЗ рд▓реЗрдЦ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ ShowDialog рдкрджреНрдзрддрд┐ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛
[DllImport("user32")] internal static extern bool EnableWindow(IntPtr hwnd, bool bEnable); public void ShowModal() { IntPtr handle = (new WindowInteropHelper(Application.Current.MainWindow)).Handle; EnableWindow(handle, false); DispatcherFrame frame = new DispatcherFrame(); this.Closed += delegate { EnableWindow(handle, true); frame.Continue = false; }; Show(); Dispatcher.PushFrame(frame); }
рдореБрдЭреЗ рд╡рд┐рдВрдбреЛ рд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд┐рдВрдбреЛ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рд╕рд╣реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ...
public string GetInput() { var frame = new DispatcherFrame(); ButtonClicked += () => { frame.Continue = false; }; Dispatcher.PushFrame(frame); return Text; }
Dispatcher.PushFrame(frame)
GetInput()
рд╡рд┐рдзрд┐ рдХреЛ Dispatcher.PushFrame(frame)
рд╕реЗ GetInput()
рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред GetInput()
frame.Continue
false
рд╣реЛ рдЬрд╛рддреА false
ред рдЬрдм рдПрдХ рдирдпрд╛ рдлреНрд░реЗрдо рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рд▓реВрдк рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд▓реВрдк рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдмрд┐рдВрджреБ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ (рдлреНрд░реЗрдоред рдмрдВрдж frame.Continue = false
), рдореБрдЦреНрдп рд▓реВрдк рдЙрд╕реА рд╕реНрдерд╛рди рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рдореЗрдирд╡рд┐рдВрдбреЛ рдореЗрдВ, рдПрдХ рдмрдЯрди рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдбрд╛рд▓реЗрдВ рдЬреЛ рдХрд╛рд░реНрдп рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдкрд░ рдЬрд╛рдПрдВрдЧреЗред
рд╣реИрдВрдбрд▓рд░ рдХреЛрдб:
public RelayCommand ButtonClick => new RelayCommand(() => { Task.Factory.StartNew(() => {
рдореИрдВрдиреЗ рджреЛ-рдХрд╛рд░рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреИрдкреНрдЪрд╛ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрд╡реЗрджрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
! рдирдореВрдирд╛ рдХреЛрдб рдореЗрдВ mvvm рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬреЛрд░ рд╕реЗ рдордд рдорд╛рд░реЛ рд▓рд╛рдкрддрд╛ рдбрд┐рдЬрд╛рдЗрди
рдЧрд┐рддреБрдм рд╕реНрд░реЛрдд рдХреЛрдб: рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
рд▓реЗрдЦ "рдХрд╕реНрдЯрдо ShowDialog"
рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╕реНрдкреИрдЪрд░рдлреНрд░реЗрдо рд╡рд░реНрдЧ рдХрд╛ рдбрд░рд╛рд╡рдирд╛ рд╡рд┐рд╡рд░рдг
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рджреА рдЧрдИ рд╣реИ ред