отключение окна - PullRequest
1 голос
/ 20 мая 2010

В моем приложении у меня есть Button. Если кнопка нажата в качестве выбора для базы данных, выполняется и результат отображается в ListView. Поскольку выбор довольно сложен, для извлечения данных требуется некоторое время.

Когда я нажимаю Button, приложение- Window должно быть отключено до загрузки данных. Но когда я установил для IsEnabled -Property окна значение false, окно будет отключено после загрузки данных.

Я пытался отключить Window в другом потоке с помощью BackgroundWorker. Но тогда я получаю исключение, что окно уже используется другим потоком.

Как отключить Window, когда он извлекает данные?

Ответы [ 4 ]

2 голосов
/ 20 мая 2010

Вы сделали неправильную вещь в фоновом потоке. Вы должны воздействовать на пользовательский интерфейс из потока пользовательского интерфейса, и загрузка данных должна выполняться в фоновом потоке.

Самый простой подход - использовать BackgroundWorker для загрузки ваших данных, сохранять эти данные в переменной уровня класса, а когда ваша фоновая работа завершена , пользовательский интерфейс включает и загружает данные из переменной уровня класса.

1 голос
/ 20 мая 2010

Я думаю, вы бы переместили активность базы данных в фоновый поток, чтобы оставить отзывчивым ваш пользовательский интерфейс (даже если он отключен), а не наоборот.

0 голосов
/ 24 мая 2010

Я предложу окно "BusyDialog" в дополнение к фоновой теме.

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

public partial class BusyDialog : Window
{
    public BusyDialog()
    {
        InitializeComponent();
    }

    public static T Execute<T>(DependencyObject parent, Func<T> action)
    {

        Window parentWindow = null;
        if (parent is Window)
        {
            parentWindow = parent as Window;
        }
        else
        {
            parentWindow = Window.GetWindow(parent);
        }

        T val = default(T);
        Exception le = null;
        BusyDialog bd = new BusyDialog();
        bd.Owner = parentWindow;
        ThreadPool.QueueUserWorkItem((o) =>
        {
            try
            {
                val = action();
            }
            catch (Exception ex)
            {
                le = ex;
            }
            bd.EndDialog();
        });
        bd.ShowDialog();
        if (le != null)
        {
            Trace.WriteLine(le.ToString());
            throw new Exception("Execute Exception", le);
        }
        return val;
    }

    private void EndDialog()
    {
        Dispatcher.Invoke((Action)delegate() {
            this.DialogResult = true;
        });
    }

}

Теперь вы можете использовать следующий способ для асинхронного вызова вашего метода,

List<Result> results = BusyDialog.Execute( this , 
   ()=>{
       return MyLongDatabaseLoadingCall();
   });

Вот что происходит,

  1. BusyDialog отображается модально, блокируя любой пользовательский ввод, а также отображая занятую анимацию
  2. Вызов вашего метода MyLongDatabaseLoadingCall выполняется в ThreadPool.QueueUserItem, который асинхронно вызывает ваш метод в другом потоке (то же самое, что и функция фоновой многопоточности, предложенная другими здесь).
  3. Анимация продолжается до выполнения вызова
  4. Когда ваш метод заканчивается, BusyDialog заканчивается, и все возвращается к тому, что было.
0 голосов
/ 24 мая 2010

попробуйте это:

BackgroundWorkerHelper.DoWork<Type of object you want to retrieve>(
                   () =>
                   {
                      //Load your data here
                      //Like
                        using (MarketingService svc = new MarketingService())
                        {
                            return svc.GetEmployeeLookupTable();
                        }
                   },
                       (args) =>
                       {
                           this.IsEnable = true;
                           if (args.Error == null)
                           {
                               Your Target Datasource= args.Result;
                           }
                       });

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