Не могу установить DialogResult в WPF - PullRequest
28 голосов
/ 22 мая 2009

Я показываю окно WPF, используя ShowDialog () из вызывающего окна. Окно открывается и является модальным, как и ожидалось. Тем не менее, в моих событиях нажатия кнопки OK и Отмена в диалоговом окне я установил this.DialogResult = true (или false) соответственно, и значение не устанавливается. Окно закрывается, как и ожидалось, но DialogResult все еще нулевой.

Это ошибка в WPF? Или есть причина, по которой свойство DialogResult не может быть установлено, но не выдает исключение? Окно не размещено в браузере.

Код в окне вызова:

Window2 win = new Window2();
bool? result = win.ShowDialog();
if (result.HasValue && result.Value) {
   //never gets here because result is always null
}

Код в диалоговом окне:

this.DialogResult = true;

Ответы [ 9 ]

18 голосов
/ 25 мая 2009

DialogResult это недействительный бул. Однако вам не нужно разыгрывать его, чтобы получить его ценность.

bool? result = myWindow.ShowDialog();
if (result ?? false)
{
  // snip
}

?? устанавливает значение по умолчанию для возврата, если результат равен нулю. Дополнительная информация: Использование типов Nullable (Руководство по программированию в C #)

Что касается исходного вопроса, единственный раз, когда я видел и отслеживал эту проблему, это когда окно располагалось между установкой DialogResult и закрытием окна. К сожалению, единственный совет, который я могу предложить, - это пройтись по коду и проверить порядок операций. Я считаю, что я «исправил» это, установив DialogResult и затем явно закрыв окно.

11 голосов
/ 22 мая 2009

Ну, во-первых, вы должны принять во внимание, что он возвращает допустимое значение bool (bool?), Поэтому, чтобы сравнить его или установить для другой переменной, вы должны привести его к обычному bool

bool result = (bool)myWindow.DialogResult;

Что касается нуля ... Я не понимаю, почему это должно происходить, если только для него не установлено значение null ПОСЛЕ того, как ему присвоено значение true или false. Вы можете показать свой код?

EDIT:

Ваш код работал нормально для меня, вот что у меня во втором окне:

private void button2_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

А в Window1:

private void window1_Loaded(object sender, RoutedEventArgs e)
{
    Window2 win = new Window2();

    bool? result = win.ShowDialog();

    if (result.HasValue && result.Value)
    {
        //it DID get here
    }
}

Есть ли большая разница?

7 голосов
/ 08 ноября 2011

У меня только что была точно та же проблема, и это, кажется, вызвано моим переопределением метода OnClosing (). Мне нужно было переопределить OnClosing (), чтобы пользователь не мог закрыть модальное окно с помощью кнопки закрытия (X).

Когда я комментирую метод OnClosing (), проблема исчезает, и возвращается DialogResult с ожидаемыми значениями true или false, как установлено.

Для интереса здесь были мои обработчики нажатия кнопок и метод OnClosing:

private void AlternateButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;
    buttonHasBeenClicked = true;
    this.Close();
}

private void DefaultButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
    buttonHasBeenClicked = true;
    this.Close();
}

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    base.OnClosing(e);
    if (!buttonHasBeenClicked)
    {
        // Prevent the user closing the window without pressing one of the buttons.
        e.Cancel = true;
    }
}
3 голосов
/ 11 декабря 2011

Я тоже сталкивался с этой проблемой, и я нашел единственный способ ее исправить, используя этот код в моем классе:

public new bool? DialogResult { get; set; }

и после настройки DialogResult у меня все получится !! (очень странная проблема). это был код, который я использовал:

cmdCancel = new RelayCommand(() => { DataContact.Reload(); this.DialogResult = false; this.Close(); });

и чтобы открыть мой диалог:

public static MessageBoxResult ShowQuestionYesNo(string message)
        {
            POLMessageBox w = new POLMessageBox("سوال", MessageBoxType.QuestionYesNo, message);
            w.ShowDialog();
            var b = w.DialogResult;
            if (b == true) return MessageBoxResult.Yes;
            if (b == false) return MessageBoxResult.No;
            return MessageBoxResult.No;
        }
2 голосов
/ 12 июня 2009

Вы закрываете окно перед тем, как установить DialogResult? Вы должны опубликовать весь контент ваших обработчиков событий кнопки.

0 голосов
/ 17 июля 2018

Проблема связана с жизнью формы:

Событие диалога private void _loginViewModel_LoginEvent (отправитель объекта, LoginViewModel.LoginEventArgs e) { DialogResult = true; this.Close (); }

Работает:

var login = new Login();
var result = login.ShowDialog();

НЕ работает:

var result = new Login().ShowDialog();
0 голосов
/ 17 июня 2017

У меня была похожая проблема, но моя проблема возникла из кода в моем заключительном заявлении. Я пытался Dispose () List до закрытия окна, а затем присвоил свойству List <> значение null ... он задыхался от свойства set, когда пытался установить его значение на null, поэтому я пришел следующий неуклюжий обходной путь в моем методе набора свойств, и все работало впоследствии:

    List<SettingItem> settingItems;
    public IEnumerable<SettingItem> Settings
    {
        get
        {
            return settingItems.OrderBy(t => t.Name).AsEnumerable();
        }
        set
        {
            if (value == null)
            {
                settingItems.Clear();
            }
            else
            {
                settingItems = value.ToList();
            }
        }
    }
0 голосов
/ 11 февраля 2016

У меня есть следующее на странице диалогового окна. (dialogwindow.xaml.cs)

   private void dlgWindowYesButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        this.Close();
    }

    private void dlgWindowNoButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        this.Close();
    }

На странице вызова я использовал следующее диалоговое окно:

dialogwindow dWinObj = new dialogwindow();
if(dWinObj.ShowDialog().Value == true)
{
  //perform the operation when the user clicks "Yes"
}
0 голосов
/ 11 ноября 2013

Я тоже столкнулся с проблемой. Оказывается, я установил DialogResult внутри скобки оператора IF и по этой причине (как бы странно это ни казалось) вызвал ошибку. Как только эта единственная строка была удалена, проблема была решена.

private void OKButton_Click(object sender, RoutedEventArgs e)
    {
        if (!string.IsNullOrEmpty(startBlockPosBox.Text))
        {
          .. do stuff ..
        }
        else
        {
          .. do stuff ..
          DialogResult = true; // this line caused the problem
        }

        DialogResult = true;
    }
...