Заставить поток пользовательского интерфейса ждать с помощью Thread.sleep - PullRequest
2 голосов
/ 03 января 2012

Я написал этот код на C # для WP7:

public void btn_handler(object sender, EventArgs args)
    {
        Button btn_Pressed = (Button)sender;
        ImageBrush br = new ImageBrush();
        br.ImageSource = new BitmapImage(new Uri("/images/cat.png"
                                                 , UriKind.Relative));

        btn_Pressed.Background = br;

        Thread.Sleep(5000);

       SolidColorBrush sBrush = new SolidColorBrush(); 
       sBrush.Color = System.Windows.Media.Colors.White;
       btn_Pressed.Background = sBrush;            
    }

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

Я новичок в WP.Я попытался найти решение, и я получил создать DispatcherThread, но я не понимал, что делать дальше.Пожалуйста, помогите: (

Ответы [ 2 ]

5 голосов
/ 03 января 2012

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

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

Кнопка Получает щелчок.Пользовательский интерфейс изменить фон кнопки на изображения.Затем он спит в течение 5 секунд, а затем меняет фон на белый.Обратите внимание, что поток пользовательского интерфейса все еще занят.Он будет обновлять фактический интерфейс только тогда, когда он будет бесплатным.Как только он изменил цвет на белый, он становится бесплатным и обновляет интерфейс, и вы видите изменения на экране.

Вам нужно сделать это

 //inside the button click event create a background worker
 BackgroundWorker worker = new BackgroundWorker();
 worker.RunWorkerCompleted += new 

 RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
 worker.DoWork += new DoWorkEventHandler(worker_DoWork);
 worker.RunWorkerAsync();

 Button btn_Pressed = (Button)sender;
 ImageBrush br = new ImageBrush();
 br.ImageSource = new BitmapImage(new Uri("/images/cat.png", UriKind.Relative));

 btn_Pressed.Background = br;


 public static void worker_RunWorkerCompleted(object sender, 
                                              RunWorkerCompletedEventArgs e)
    {
    //once backgroudn work i.e. DoWork is complete this method will be 
    //called and code below will execute in UI thread
    SolidColorBrush sBrush = new SolidColorBrush(); 
    sBrush.Color = System.Windows.Media.Colors.White;
    btn_Pressed.Background = sBrush;  
    }

 public  static  void worker_DoWork(object sender, DoWorkEventArgs e)
    {
    //it will wait 5 secs in the background thread
    Thread.Sleep(5000);
    }
3 голосов
/ 03 января 2012

Вы никогда не должны блокировать поток пользовательского интерфейса, вызывая Thread.Sleep.

. Я думаю, что лучшее решение - это создать раскадровку в вашем XAML, которая будет выполнять необходимые визуальные изменения.,Ваш обработчик события нажатия кнопки должен затем просто вызвать Begin на раскадровке.

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