Ответ 1
Настройка результата диалога работает только при открытии формы с помощью ShowDialog(). Вы получаете эту ошибку, когда пытаетесь установить результат диалога в форме, открытой с помощью Show().
Я пытаюсь реализовать этот шаблон MVVM для закрытия формы WPF, что также объясняется в этом блоге, и я получаю System.InvalidOperationException с сообщением об ошибке "DialogResult может быть установлен только после Window создан и показан как диалог. " когда я пытаюсь установить результат диалога при нажатии кнопки "Закрыть":
DialogResult = true;
Вот моя ViewModel:
class MainWindowViewModel:INotifyPropertyChanged
{
private bool? dialogResult;
public bool? DialogResult
{
get { return dialogResult; }
set
{
if (value != this.dialogResult)
{
this.dialogResult = value;
OnPropertyChanged("DialogResult");
}
}
}
public string Text
{
get { return "Hello!"; }
}
void CloseCommandExecute()
{
this.DialogResult = true;
}
и вот представление XAML:
<Window x:Class="WpfApplication.Mvvm.Windowclosing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication.Mvvm.Windowclosing"
local:DialogCloser.DialogResult="{Binding DialogResult}"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<TextBlock Text="{Binding Text}" Grid.Row="0"/>
<Button Grid.Row="1" Command="{Binding CloseCommand}">Close Me</Button>
</Grid>
</Window>
Что я здесь не так делаю?
Настройка результата диалога работает только при открытии формы с помощью ShowDialog(). Вы получаете эту ошибку, когда пытаетесь установить результат диалога в форме, открытой с помощью Show().
Я столкнулся с этой проблемой, когда создал окно, которое вызывалось через ShowDialog()
. В окне у меня был Ok_Clicked
, который включал кучу утверждений. Чтобы "гарантировать" диалог вернул false, если что-то было не так, я сначала инициализировал DialogResult
как false. Если все было правильно, я затем установил DialogResult
в true и закрыл окно. Я продолжал получать то же исключение.
Я узнал, что если бы DialogResult
не был установлен в true, ShowDialog
всегда возвращал бы false. Когда я удалил DialogResult = false
в начале Ok_Clicked
, я больше не получил исключение.
Я столкнулся с альтернативным ответом, который может помочь другим. Я закончил с вызовом Close() в окне перед установкой DialogResult. Убедитесь, что вы этого не сделаете - это вызовет эту ошибку.
Для тех, кто использует ShowDialog, вы можете удалить свойства с кнопки:
IsCancel= истина а также IsDefault= истина
Вы пытаетесь установить Window.DialogResult
слишком рано из-за привязки. Предположительно, ваша DialogCloser.DialogResult
(которую вы не показали нам) также устанавливает DialogResult
на Window
. Попробуйте изменить режим привязки на OneWayToSource
, чтобы изменения распространялись только на вашу виртуальную машину, а не наоборот:
local:DialogCloser.DialogResult="{Binding DialogResult, Mode=OneWayToSource}"
Или, может быть, это просто вопрос изменения вашего поведения, чтобы установить Window.DialogResult
, если Window
был показан как диалог. Трудно сказать, не видя всего.
Я столкнулся с той же проблемой, используя ShowDialog() и установив результат перед вызовом close.
Однако я сделал скрыть диалог перед установкой результата. Таким образом, при настройке DialogResult значение Visibility должно быть установлено на Visible, и Hidden and Collapsed даст вам ошибочную ошибку, которую "DialogResult" можно установить только после создания окна и отображения в виде диалога. ".
Для меня, как и для Jarvis, эта ошибка была вызвана установкой DialogResult после вызова Close() для окна, которое было показано с помощью ShowDialog().
В моем случае, я думаю, это было потому, что я переносил код из WinForms в WPF. Этот порядок работал в WinForms, но WPF это не нравится.
Я пробовал другие исправления, такие как удаление атрибутов isDefault и isCancel из моих кнопок, но они не имели никакого эффекта.
Я знаю, что эта тема уже довольно старая, но сегодня я столкнулся с той же проблемой. Что я делал неправильно, так это то, что я открыл новое окно с помощью ShowDialog()
, а затем закрыл новое окно с помощью Close()
и попытался установить для DialogResult значение True.
Но этого уже достаточно, если вы только установите для DialogResult значение True, и после этого окно автоматически закроется, и нет необходимости вызывать метод Close()
.
Я получил эту ошибку и решил ее, установив DialogResult перед любым другим кодом в обработчике события click. Когда это было в конце, как раз перед Close, я получал ошибку. Но с этим в начале это работает. Надеюсь, это кому-то поможет, это сводило меня с ума, прежде чем я наконец заработал.