質問

ダイアログの結果がWPFの無意味なブールであるという事実について、誰もが良い説明を考えることができますか?これはいつも私を困惑させてきました。 Winformsでは、それは列挙タイプであり、それは私にとってはるかに理にかなっています。

役に立ちましたか?

解決

私の意見では、ほとんどの場合、あなたは 一般化された専門 再試行や無視などのオプション。

OK/キャンセル以上が必要な場合は、たとえば、書面による回答を使用して、何らかのタスクダイアログを使用することになっています。そうすれば、数十年前に誰かが考えていたいくつかの列挙価値に限定されず、Dialogresultは基本的な使用のために正/否定的であり、高度なニーズに固有の独自のプロパティを実装できます。したがって、true/falseのみが必要であり、nullはウィンドウがまだ閉じられていないことを示しています(まだプロパティに値が割り当てられていません)。

ユーザーが答えるだけの質問以上のダイアログがある場合(たとえば、エントリフォーム)、通常はOK/キャンセルを使用する方が良いので、それ以上の値は必要ありません。

他のヒント

DialogResult プロパティはで定義されています Window クラス。すべてではない Windowsはダイアログです。したがって、プロパティはすべてのウィンドウに関連していません。 a Window それは介して示されています Show() それよりも ShowDialog() 意志(おそらく、何らかの理由で設定しない限り) DialogResult = null.

これが実証する簡単な例です。

window1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <Button Name="b1">Show</Button>
        <Button Name="b2">ShowDialog</Button>
    </StackPanel>
</Window>

window1.xaml.cs:

using System.Windows;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            b1.Click += new RoutedEventHandler(b1_Click);
            b2.Click += new RoutedEventHandler(b2_Click);
        }

        void b1_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.Closed += delegate
            {
                MessageBox.Show("" + w.DialogResult);
            };

            w.Show();
        }

        void b2_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.ShowDialog();
            MessageBox.Show("" + w.DialogResult);
        }
    }
}

Windowsを閉じると、ダイアログには DialogResultfalse, 、ダイアログ以外はを持っています null DialogResult.

によると MSDNドキュメント:

ダイアログボックスが表示されますが、受け入れられたりキャンセルされたりすることはありません。

しかし、ダイアログにアクセスする複数のスレッドを扱っていない限り、それがどのように起こるかはわかりません。

ドキュメントは、次のことのいずれかが起こったときに偽りであると言います。

  • プレスサルト+F4。
  • 閉じるボタンをクリックします。
  • システムメニューから閉じることを選択します。

showdialogは常に真またはfalseを返します。 DialogResultは、ダイアログが開いているときにのみヌル状態を取得します。 nullからtrueまたはfalseへの移行は、ダイアログを閉じて、showdialogリターンへの元の呼び出しを行います。

IMOこれは、Dialogresultが常に使用されていないためです。 dialogresultをshowdialog()メソッドで呼び出す場合にのみDialogResultを設定できます。Show()メソッドで呼び出して、Dialogresultを何でも設定しようとすると、無効なエクセプトがスローされます。だから、それがショー()メソッドでウィンドウを呼び出す場合、nullになる場合、showdialog()を使用してそれを呼び出すと、それがあなた次第であると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top