2012-06-12 2 views
1

У меня есть функция класса в приложении WPF (с использованием .Net 4.0), которое проходит через синхронную процедуру, которая должна сделать несколько остановок внутри нее, чтобы дождаться, когда пользователь будет готов , Поэтому в рамках процедуры мне нужно открыть некоторые диалоговые окна, которые просто приостанавливают процедуру, пока пользователь не нажмет «ОК».Вызов диалоговых окон в методе класса

Какой самый чистый способ реализовать это?

Я не решаюсь испортить функцию класса с помощью диалоговых окон WPF, если есть способ заставить функцию сигнализировать MainWindow, чтобы вызывать диалоги вместо этого. Или я не должен беспокоиться об этом?

+0

ли процедура синхронизации или асинхронная ? Какая версия .Net? – IAbstract

+0

@IAbstract Синхронный. Версия 4. – user754852

+0

@Blam Да, извините. – user754852

ответ

1

Я бы использовал следующее, пока вы не определите лучший способ рефакторинга. Не зная, какой-либо из вашей конкретной архитектуры:

void MyLongProcedure() { 
    // do some stuff 
    if(GetDialog() == DialogResult.OK) { } 

    // do some more stuff 
    if(GetDialog() == DialogResult.OK) { } 
} 

DialogResult GetDialog() { 
    return myDialog.ShowDialog(); 
} 

Если когда-либо вариант, чтобы остановить процедуру, то вы можете добавить проверку на DialogResult.Cancel и реализовать изящный выход на длительную процедуру.

1

Его трудно дать точный ответ без каких-либо дополнительной информации о приложении, но я бы с чем-то вроде следующего (код не может быть скомпилирован как есть)

public class WaitForUserProcedureImpl : IWaitForUserProcedure 
{ 
    public void DoSomething(Action pause) 
    { 
     // do stuff 
     pause(); // pause 
     // do more stuff 
     // .... 
     pause(); 
    } 
} 

public class MainWindow: Window 
{ 

    private void button_click(object sender) 
    { 
     WaitForUserProcedureImpl proc = new WaitForUserProcedureImpl(); 
     Action myPauseAction = new Action(
      ()=> 
      { 
       MessageBox.Show("Press ok to continue","Press ok to continue",MessageBoxButtons.OK); 
      } 
     ); 
     proc.DoSomething(myPauseAction); 
    } 
}