WPF закрывать диалог при изменении bool? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть простой код в приложении C # WPF, использующий MaterialDesignInXamlToolkit , который открывает диалог типа please wait.

То, что я хочу, - это автоматическое закрытие диалогакогда изменяется логическое значение (из фонового потока).

У меня есть:

//create dialog
var view = new Dialog
{
    DataContext = new Domain.DialogViewModel("Please wait...", true)
};

//show
var result = await DialogHost.Show(view, "RootDialog", ClosingEventHandler);


//wait
while (finished == false)
{

}

//close dialog, or enable the 'ok' button on it.

DialogHost.CloseDialogCommand.Execute(view, view); //does not work.

Как закрыть диалог из кода?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я не знаком с материалом DialogHost, который вы используете, но в противном случае ваш вопрос довольно прост.У вас будет Задача, которая запускается в фоновом потоке, а затем переключается обратно в поток пользовательского интерфейса, когда пора закрывать диалоговое окно ожидания.

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

...

void StartLengthyTask() {
    var dlg = CreateWaitDialog();
    dlg.Show();

    // run lengthy task in a background thread
    Task.Run(new Action(BackgroundThread))

        // switch back to UI thread when finished
        .ConfigureAwait(true)
        .GetAwaiter()

        // close the wait dialog
        .OnCompleted(() => dlg.Close());

  // logic here will execute immediately without waiting on the background task
}

void BackgroundTask() {
    Thread.Sleep(5000);
}
0 голосов
/ 25 сентября 2019

Ах, мне нужно было переопределить OpenedEventHandler.Используя это:

 var view = new Dialog
            {
                DataContext = new Domain.DialogViewModel("")
            };

            //show the dialog
            var result = await DialogHost.Show(view, "RootDialog", ExtendedOpenedEventHandler, ExtendedClosingEventHandler);

Я могу захватить сеанс в функции, такой как:

   private void ExtendedOpenedEventHandler(object sender, DialogOpenedEventArgs eventArgs)
        {

            //...now, lets update the "session" with some new content!
            eventArgs.Session.UpdateContent(new ProgressDialog());
            //note, you can also grab the session when the dialog opens via the DialogOpenedEventHandler



            //lets run a fake operation for 3 seconds then close this baby.
            Task.Delay(TimeSpan.FromSeconds(3))
                .ContinueWith((t, _) => eventArgs.Session.Close(false), null,
                   TaskScheduler.FromCurrentSynchronizationContext());
        }

, а затем закрыть диалоговое окно, когда я хочу использовать:

eventArgs.Session.Close(false).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...