Ответ 1
Resize событие (или SizeChanged) будет срабатывать при изменении WindowState.
На стороне примечание WPF действительно включает событие StateChanged для этого непосредственно.
Итак, я хочу немедленно, так как эта часть программы зависит от скорости, запускает функцию, когда windowstate изменяется в моей основной форме. Мне нужно, чтобы это было что-то вроде этого:
private void goButton_Click(object sender, EventArgs e)
{
//Code
}
Я проверил вкладку событий формы, у меня нет WindowStateChanged и т.д. Как мне это сделать?
Форма будет сильно изменена, поэтому проверка, когда изменения размера не будут работать.
Resize событие (или SizeChanged) будет срабатывать при изменении WindowState.
На стороне примечание WPF действительно включает событие StateChanged для этого непосредственно.
Надеюсь, я не опоздал на вечеринку.
Способ, которым я решил реализовать его, довольно прямолинейный и не требует выделения глобальных переменных, просто проверьте значение формы WindowState
до и после base.WndProc
:
protected override void WndProc(ref Message m)
{
FormWindowState org = this.WindowState;
base.WndProc(ref m);
if (this.WindowState != org)
this.OnFormWindowStateChanged(EventArgs.Empty);
}
protected virtual void OnFormWindowStateChanged(EventArgs e)
{
// Do your stuff
}
Нижняя строка - это работает.
Вы можете попробовать переопределить функцию WndProc
как эта ссылка.
Из сообщения:
protected override void WndProc(ref Message m)
{
if (m.Msg == /*WM_SIZE*/ 0x0005)
{
if(this.WindowState == FormWindowState.Minimized)
{
// do something here
}
}
base.WndProc(ref m);
}
Этот код просто проверяет состояние формы при каждом событии Resize
.
В качестве альтернативы вы могли бы просто захватить событие формы Resize
и проверить состояние окна. Но я слышу, что он не срабатывает, когда элемент управления (или формы?) Максимизирован.
Надеюсь, это поможет!
Вы можете изменить состояние окна формы, используя другой поток. Это работает в .Net Framework 3.5
Invoke(new Action(() => { this.WindowState = FormWindowState.Normal; }));
Надеюсь, это поможет вам.
public partial class Form1 : Form {
private FormWindowState mLastState;
public Form1() {
InitializeComponent();
mLastState = this.WindowState;
}
protected override void OnClientSizeChanged(EventArgs e) {
if (this.WindowState != mLastState) {
mLastState = this.WindowState;
OnWindowStateChanged(e);
}
base.OnClientSizeChanged(e);
}
protected void OnWindowStateChanged(EventArgs e) {
// Do your stuff
}
}