質問

WPF で最初のアプリケーションを作成しており、ユーザーにモーダル ダイアログ ウィンドウにデータを入力させたいと考えています。どうやら、これを WPF で行うのは簡単ではありません。親ウィンドウは完全に有効なままであり、新しい子ウィンドウを作成したメソッドは停止せず、子ウィンドウが Close() を呼び出すまで待機しないためです。むしろ、ただ前に進み続けるだけです。これは私が望んでいることではありません。

子ウィンドウを開いて、親ウィンドウが実行を続行する前に子ウィンドウが閉じるのを待機させるにはどうすればよいですか?

役に立ちましたか?

解決

を使用してウィンドウを表示しようとしましたか? ダイアログの表示 方法?

忘れずに設定してください 所有者の財産 ダイアログウィンドウからメインウィンドウに移動します。これにより、Alt+Tab キーなどを押したときの奇妙な動作が回避されます。

他のヒント

これらの答えの多くは単純化され、そして誰かがWPFを始めている場合、それは単に誰か「.ShowDialog()を使用してください!」と言っよりも複雑であるように、彼らは、「イン・アンド・アウト」のすべてを知らないかもしれません。しかし、それはあなたが基礎となる窓の使用をブロックすると、モーダルウィンドウが閉じられるまで続けるからコードを保つために使用することの方法(.Show()ではない)である。

まず、あなたは2 WPFウィンドウを必要としています。 (一方が他方を呼び出すになります。)

最初のウィンドウから、のは、それがMainWindow.xamlと呼ばれていたとしましょう、そのコードビハインドになります:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

次に、あなたのXAMLにあなたのボタンを追加します:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />

そして右クリックClickルーチン、「定義に移動」を選択します。それはMainWindow.xaml.csにあなたのためにそれを作成します。

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

その関数内では、そのページクラスを使用して他のページを指定する必要があります。

:あなたが他のページ「モーダルウィンドウ」は、それがそのページクラスになるようにという名前が付けられ、それあなたが(コール)をインスタンス化する方法をであると言います
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();
}

あなたがあなたのモーダルダイアログで設定する必要が値を持っていると言います。 ModalWindowのXAMLにテキストボックスとボタンを作成します:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>

その後、再び、イベントハンドラ(別Clickイベント)を作成し、ModalWindowとコールthis.Close()上のpublic static変数にテキストボックスの値を保存するためにそれを使用。

public partial class ModalWindow : Window
{
    public static string myValue = String.Empty;        
    public ModalWindow()
    {
        InitializeComponent();
    }

    private void btnSaveData_Click(object sender, RoutedEventArgs e)
    {
        myValue = txtSomeBox.Text;
        this.Close();
    }
}

次に、あなたの.ShowDialog()文の後、あなたはその値を取得し、それを使用することができます:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

Window.Showウィンドウは、ウィンドウを表示し、実行を継続します - それは非ブロッキング呼び出しです。

Window.ShowDialog呼び出しスレッドをブロックする(ちょっと[1])、およびダイアログを示します。また、親/所有するウィンドウとの相互作用をブロックします。ダイアログが却下された場合(forwhateverの理由は)ShowDialogを呼び出し元に戻り、あなたは(あなたがそれをしたい場合)。DialogResultにアクセスできるようになります。

[1]は、WPFのdipatcherにディスパッチャフレームを押してディスパッチャポンピングを続けます。これは、ポンピングを維持するために、メッセージポンプの原因になります。

ウィンドウオブジェクトmywindowを考えると、myWindow.Show()がモードレスそれを開き、myWindow.ShowDialog()モーダルを開きます。しかし、後者は、私が覚えているから、ブロックされません。

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