GUI не обновляется до конца события - PullRequest
3 голосов
/ 22 апреля 2011

У меня есть графический интерфейс, который необходимо обновить с аппаратного устройства, подключенного через файл DLL и текстовое поле. Моя проблема в том, что графический интерфейс не обновляется до конца события, и мне нужно показать что-то пауза, а затем показать что-то еще. Взлом Application.DoWork ничего не изменил. У кого-нибудь есть предложения? Все, что я читал, использовало либо invoke, либо DoEvents, и ни одно из них, похоже, не меняло поведение.

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {

            App.myMainWindow.image1.Visibility = Visibility.Hidden;
            System.Windows.Forms.Application.DoEvents();


        }
        Thread.Sleep(4000);
    }

Ответы [ 4 ]

2 голосов
/ 22 апреля 2011

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

Редактировать: System.Windows.Forms.Application.DoEvents(); Вы уверены в этом тэге WPF, не так ли?

1 голос
/ 22 апреля 2011
0 голосов
/ 23 апреля 2011

Я понял это, используя таймеры, как предложил Витторе.Это должен быть способ сделать это, так как вы не можете спать поток GUI во время обработчиков событий GUI.

public partial class MainWindow : Window 
{
    static Timer _timer;

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {

            this.image1.Visibility = Visibility.Hidden;
            this.image2.Visibility = Visibility.Visible;

            _timer = new Timer(2000);
            _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
            _timer.Enabled = true; // Enable it
        }
    }

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        textBox1.Dispatcher.Invoke(new Action(delegate()
        {
            _timer.Enabled = false;
            this.image1.Visibility = Visibility.Visible;
            this.image2.Visibility = Visibility.Hidden;
        }));
    }
0 голосов
/ 22 апреля 2011

Я бы использовал фонового работника и запустил его в обработчике кликов.

Таким образом, графический интерфейс пользователя будет по-прежнему доступен и будет отображаться прогресс.

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