Как обновить Windows Forms после их запуска? C # или F # - PullRequest
0 голосов
/ 09 января 2019

С кодом ниже я пытаюсь печатать i в текстовом поле каждую секунду, но это не обновляет текстовое поле. Я что-то упустил?

open System
open System.Drawing
open System.Windows.Forms
open System.Threading

let form = new Form()

let textBox = new TextBox()

textBox.Text <- "Hello, World."

form.Controls.Add textBox

Application.Run form

let rec main i =
    Thread.Sleep(1000)
    textBox.Text <- sprintf "Hello, World. %i" i
    form.Controls.Add textBox
    main (i + 1)

main 0

1 Ответ

0 голосов
/ 10 января 2019

Вам следует использовать System.Windows.Forms.Timer, если вы хотите периодически что-то обновлять в форме. Укажите желаемый интервал времени срабатывания таймера, добавьте обработчик событий Tick (который обновляет текст в текстовом поле) и запустите таймер:

let form = new Form()
let textBox = new TextBox(Text = "Hello, world.")
form.Controls.Add textBox

let mutable value = 0 // counter
let timer = new Timer(Interval = 1000) // this timer will fire tick events each second
timer.Tick.Add <| fun _ -> // you can ignore argument which is passed to handler
    value <- value + 1
    textBox.Text <- sprintf "Hello, World. %i" value

timer.Start()
Application.Run(form)

Почему ваш образец не работает? Прежде всего Application.Run блокирует дальнейшее выполнение, пока вы не закроете открытую форму. Но даже если вы будете использовать form.Show() для выполнения рекурсивной функции во время отображения формы, вы увидите, что форма застряла и не обновилась. Потому что вы замораживаете основной поток на Thread.Sleep, а форма не может обрабатывать события и перерисовывать себя. form.Refresh() позволит вам увидеть обновления, но между ними форма не будет реагировать. Кроме того, вам не нужно добавлять textBox для формирования элементов управления на каждой итерации.

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