30

呼び出しウィンドウから ShowDialog() を使用して WPF ウィンドウを表示します。ウィンドウが開き、予想どおりモーダルです。ただし、ダイアログ ウィンドウの [OK] ボタンと [キャンセル] ボタンのクリック イベントで、それぞれ this.DialogResult = true (または false) を設定しましたが、値が設定されません。ウィンドウは期待どおりに閉じますが、DialogResult はまだ null です。

これは 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;
4

10 に答える 10

10

まず第一に、null 許容の bool (bool?) を返すことを考慮に入れる必要があるため、それを比較したり、別の変数に設定したりするには、通常の bool にキャストする必要があります。

bool result = (bool)myWindow.DialogResult;

それがnullであることについては... trueまたはfalseに設定された後に何らかの形でnullに戻されない限り、なぜそれが起こるべきかわかりません。コードを表示できますか?

編集:

あなたのコードは私にとってはうまくいきました.これは私が2番目のウィンドウに持っているものです:

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

大きな違いはありますか?

于 2009-05-22T16:28:55.060 に答える
8

まったく同じ問題が発生したばかりで、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;
    }
}
于 2011-11-08T07:21:46.207 に答える
4

私もこの問題に悩まされていましたが、それを修正するために見つけた唯一の方法は、クラスでこのコードを使用することでした:

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;
        }
于 2011-12-11T03:48:35.963 に答える
2

DialogResult を設定する前にウィンドウを閉じますか? ボタン イベント ハンドラの内容全体を投稿する必要があります。

于 2009-06-12T15:07:49.973 に答える
0

ダイアログウィンドウページに次のものがあります。(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"
}
于 2016-02-10T22:07:30.057 に答える
-1

私は同様の問題を抱えていましたが、私の問題は締めくくりの声明内のコードにありました。ウィンドウを閉じる前に List を Dispose() しようとしていて、List<> プロパティを null に設定していました...値を null に設定しようとしたときに set プロパティで窒息していたため、プロパティの設定メソッドで次の不器用な回避策を実行すると、その後すべてが機能しました。

    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();
            }
        }
    }
于 2017-06-16T22:43:12.267 に答える