wake-up-neo.com

Kann DialogResult in WPF nicht festlegen

Ich zeige ein WPF-Fenster mit ShowDialog () aus dem aufrufenden Fenster. Das Fenster wird geöffnet und ist erwartungsgemäß modal. In den Klickereignissen der Schaltflächen OK und Cancel im Dialogfenster habe ich jedoch Folgendes festgelegt.DialogResult = true (oder false), und der Wert wird nicht festgelegt. Das Fenster wird wie erwartet geschlossen, DialogResult ist jedoch immer noch null. 

Ist das ein Fehler in WPF? Oder gibt es einen Grund, warum die DialogResult-Eigenschaft nicht festgelegt werden kann, aber keine Ausnahme auslöst? Das Fenster wird nicht in einem Browser gehostet.

Code im aufrufenden Fenster: 

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

Code im Dialogfenster:

this.DialogResult = true;
28
quinnapi

DialogResult ist ein nullwertfähiger Bool. Sie müssen es jedoch nicht einsetzen, um seinen Wert zu erhalten. 

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

Das ?? Legt den Standardwert für die Rückgabe fest, wenn das Ergebnis null ist. Weitere Informationen: Verwenden von nicht zulässigen Typen (C # -Programmierhandbuch)

Was die ursprüngliche Frage angeht, so habe ich dieses Problem nur dann gesehen und verfolgt, wenn das Fenster zwischen dem Festlegen des DialogResult und dem Schließen des Fensters verschoben wurde. Leider kann ich Ihnen nur einen Rat geben, indem Sie Ihren Code durchgehen und die Reihenfolge der Vorgänge überprüfen. Ich glaube, ich habe das Problem behoben, indem Sie die Variable DialogResult gesetzt und das Fenster dann explizit geschlossen haben. 

18
Dennis

Zunächst einmal müssen Sie berücksichtigen, dass ein nullwertfähiger Bool (Bool?) Zurückgegeben wird. Um ihn zu vergleichen oder auf eine andere Variable zu setzen, müssen Sie ihn in einen regulären Booler umwandeln

bool result = (bool)myWindow.DialogResult;

Da es null ist, kann ich nicht verstehen, warum dies geschehen sollte, es sei denn, es wird irgendwie auf null zurückgesetzt, nachdem es auf wahr oder falsch gesetzt wurde. Kannst du deinen Code zeigen?

BEARBEITEN:

Ihr Code hat für mich gut funktioniert, das habe ich im zweiten Fenster:

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

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

Und in 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
    }
}

Gibt es einen großen Unterschied?

11
Carlo

Ich hatte gerade genau dasselbe Problem und es scheint, dass ich die OnClosing () -Methode überschreibe. Ich musste OnClosing () überschreiben, um zu verhindern, dass der Benutzer das modale Fenster mit der Schaltfläche Schließen (X) schließt.

Wenn ich die OnClosing () -Methode auskommentiere, wird das Problem behoben und das DialogResult wird mit den erwarteten Werten true oder false zurückgegeben.

Für Interesse waren hier meine Button-Click-Handler und die OnClosing-Methode:

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;
    }
}
7
dodgy_coder

Ich habe mich auch mit diesem Problem befasst, und der einzige Weg, den ich zur Behebung dieses Problems gefunden habe, war die Verwendung dieses Codes in meiner Klasse:

public new bool? DialogResult { get; set; }

und nachdem ich mein DialogResult eingestellt habe, klappt es für mich !! (sehr seltsames Problem) . Dies war der Code, den ich verwendete:

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

und um meinen Dialog zu öffnen:

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;
        }

Schließen Sie das Fenster, bevor Sie das DialogResult festlegen? __ Sie sollten den gesamten Inhalt Ihrer Schaltflächenereignishandler bereitstellen.

2
batzen

Das Problem ist auf die Lebensdauer der Form zurückzuführen:

Dialogereignis private void _loginViewModel_LoginEvent (Objektsender, LoginViewModel.LoginEventArgs e) { DialogResult = true; so nah(); }

Werke:

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

Funktioniert nicht:

var result = new Login().ShowDialog();
0
jlo-gmail

Ich bin gerade auch auf das Problem gestoßen. Es stellte sich heraus, dass ich DialogResult in eine geschweifte Klammer einer IF-Anweisung gesetzt hatte und aus diesem Grund (so seltsam es auch scheinen mag) den Fehler verursacht hat. Sobald diese einzelne Zeile entfernt wurde, wurde das Problem behoben.

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;
    }
0
dracore

Ich habe folgendes in der Dialogfensterseite. (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();
    }

Auf der aufrufenden Seite habe ich das Dialogfenster folgendermaßen verwendet:

dialogwindow dWinObj = new dialogwindow();
if(dWinObj.ShowDialog().Value == true)
{
  //perform the operation when the user clicks "Yes"
}
0
Kishore