Решена проблема. Мне нужно было разместить навигацию в подписке на мой входящий вызов:
login-component.ts
...
this.loginForm = this.fb.group({
username: ['', Validators.required],
password: ['', Validators.required]
})
...
onSubmit() {
const formValue = this.loginForm.value;
if (formValue.username && formValue.password) {
this.authService.login(formValue.username, formValue.password)
.subscribe(
resp => {
console.log(resp);
this.router.navigateByUrl('/registration');
},
err => { console.log(err); }
)
}
}
В событии load не очень хорошая идея закрыть форму. Сделайте это после Активированного события.
Хорошо, не хочу отвечать на мой собственный вопрос, но это сводило меня с ума, и это была одна из самых сложных ошибок для воспроизведения, которую я когда-либо видел.
В своей форме я переопределяю методы OnFormLoad и OnFormClose, где я сохраняю / восстанавливаю размер формы, местоположение и WindowState в / из реестра. Я взял этот код, и он решил проблему. Странно то, что я отложил это, и проблема не вернулась.
Я наконец воспроизвел проблему: вы должны позволить форме полностью открыться, развернуть ее, а затем закрыть, чтобы сохранить состояние «Развернуто» в реестр. Затем, когда вы снова откроете его, он установит его на Maximized, и если он закрывается в обработчике загрузки, он пытается получить доступ к размеру / расположению при закрытии. Видимый доступ к этим значениям в методе OnFormClosing заставляет форму пытаться сфокусироваться, ЕСЛИ И ТОЛЬКО ЕСЛИ форма развернута, что недопустимо, так как форма была удалена.
Таким образом, в основном, вы не можете получить доступ к свойствам отображения формы в метод OnFormClosing формы, если эта форма будет вызывать Close из своего события Load.
Одна возможность:
У них может быть таймер в этой форме, который инициализируется и включается в их FormLoad событие. Таймер также должен быть отключен и остановлен, прежде чем форма будет закрыта, если таймер пытается получить доступ к форме при ее запуске.
Я видел формы до того, как это сделать ...
Мне кажется, что если не присматриваться к нему, то самым чистым способом достижения желаемого может быть создание пользовательского класса формы, производного от Form
, и переопределение OnFormLoad (...
Вы пробовали войти в код .net, чтобы увидеть, какая строка кода вызывается при возникновении исключения? Если у вас VS 2008, вы можете сделать это, перейдя в Инструменты -> Параметры -> Отладка и выбрав Включить степпинг исходного кода .NET Framework. Имейте в виду, что загрузка всех необходимых файлов может занять некоторое время, но таким образом вы можете войти в form.Show () и точно увидеть, что происходит.
Хорошо, оказывается, это немного Проще и более универсально, чем я думал, но все же странно и неясно.
Если вы сохраняете / загружаете форму Size / Location / WindowState, когда форма загружается / закрывается, как мы, вы должны убедиться, что метод OnLoad сначала вызывает base.OnLoad, чтобы сработал обработчик события Form Load, а затем установите свойства. Невыполнение этого требования вызовет проблему, только если форма вызывает метод Close из метода Load. Вы получите ObjectDisposedException при вызове Show после завершения события закрытия формы.
У меня болит голова.