Попытка получить данные из DatePicker и текстового поля, используя событие таймера - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь получить данные из DatePicker с именем targetDate и пары TextBox с именами targetHour и targetMinute.Я хочу читать то, что есть в них каждую секунду.Поэтому я создал таймер следующим образом:

System.Timers.Timer tmr = null;
private void SetTimer()
{
    tmr = new System.Timers.Timer(1000);
    tmr.AutoReset = true;
    tmr.Elapsed += TimerEvent;
    tmr.Enabled = true;
}

Таймер работает нормально, и я тоже получаю данные.На данный момент, только для целей проверки, я отображаю все, что получаю из targetDate, targetHour и targetMinute в другой TextBox differenceTime внутри TimerEvent.

Dispatcher.BeginInvoke(new ThreadStart(() => targetDT = targetDate.Text));
Dispatcher.BeginInvoke(new ThreadStart(() => targethh = Int32.Parse(targetHour.Text)));
Dispatcher.BeginInvoke(new ThreadStart(() => targetmm = Int32.Parse(targetMinute.Text)));
//temp = targetDT + " " + targethh + ":" + targetMinute;
Dispatcher.BeginInvoke(new ThreadStart(() => differenceTime.Text = targetDT + "-" + targethh));

Код выше работает нормально.Мой главный вопрос: есть ли лучший способ сделать это, не используя Dispatcher.BeginInvoke?Кроме того, но менее важно, если я пытаюсь использовать строку temp для заполнения differenceTime, это не работает, почему это так?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Мой главный вопрос: есть ли лучший способ сделать это, не используя Dispatcher.BeginInvoke?

Либо замените System.Timers.Timer на DispatcherTimer, как предложено@Jeff R и обработай его Tick событие.Тогда код внутри вашего Tick обработчика событий всегда будет выполняться в потоке пользовательского интерфейса, что означает, что вы можете получить прямой доступ к элементам управления.

Вы также можете улучшить свой текущий код, вызывая Dispatcher.BeginInvoke только один раз:

Dispatcher.BeginInvoke(new Action(() =>
{
    targetDT = targetDate.Text;
    targethh = Int32.Parse(targetHour.Text);
    targetmm = Int32.Parse(targetMinute.Text);
    differenceTime.Text = targetDT + "-" + targethh;
}));

Кроме того, но менее важно, если я попытаюсь использовать временную строку для заполнения разницы. Время не работает, почему это так?

Потому что Dispatcher.BeginInvoke возвращает до того, как делегат, который вы передаете ему, был выполнен в потоке пользовательского интерфейса.Вы, вероятно, хотите использовать Dispatcher.Invoke.

В чем разница между Invoke () и BeginInvoke ()

0 голосов
/ 17 октября 2018

Вы используете правильный WPF?

Затем попробуйте использовать System.Windows.Timer.DispatcherTimer вместо System.Timers.Timer.DispatcherTimer будет выполняться в потоке пользовательского интерфейса, поэтому может быть не столь точным с точностью до мс, но не потребует всех вызовов BeginInvoke.

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