web-dev-qa-db-ja.com

Enterキーが押されたときにWPFウィンドウ(ダイアログボックス)を閉じるにはどうすればよいですか?

モーダルダイアログとして開くWPFwindowがあります。

ダイアログには、OKCancelボタンがあり、それぞれIsDefaultIsCancelプロパティがTrueに設定されています。両方のボタンには、ダイアログボックスを閉じるClickイベントハンドラーがあります。

関連するXAMLは次のとおりです。

<StackPanel Orientation="Horizontal" Grid.Row="1"  Height="45" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="190">
    <Button Content="OK"
                Height="25" Margin="10,10,10,10" Width="75" Name="btnOK" TabIndex="1600" IsDefault="True" Click="btnOK_Click"                       
                VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />
    <Button Content="Cancel"
                Height="25" Margin="10,10,10,10" Width="75" Name="btnCancel" TabIndex="1700" IsCancel="True"
                VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="btnCancel_Click" />
</StackPanel>

背後にあるコードは次のとおりです。

private void btnOK_Click(object sender, RoutedEventArgs e)
{
    // My some business logic is here                
    this.Close();
}

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

キーボードのEscボタンを押すと(フォーカスがCancelボタンにない場合でも)、ダイアログボックスは期待どおりに閉じます。ただし、フォーカスがEnterボタンにないときにOKキーを押すと、何も起こりません。

ダイアログにDataGridがあります。データグリッドの任意の行を選択してEnterキーを押したときに、ダイアログを閉じたい。

これを実現する方法は?

追加情報:ダイアログにテキストボックスがあります。また、Keyboard.PreviewKeyDownイベントのイベントハンドラーがあります。テキストボックスを表示してEnterキーを押しても、ダイアログボックスを閉じないでください。 ただし、このハンドラーは削除できます。重要なことは、上記の質問を解決することです。

private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        this.Search(); // Does some searching
    }
}
8
Learner

あなたのコードは私にとってはうまく機能しています。 Enterキーを押すとダイアログが閉じます。 e.Handled = true;と書くことができます。 tbxSearchString_PreviewKeyDownイベントの検索機能の後の行。したがって、ダイアログは閉じません。

<Grid>
        <TextBox Name="tbxSearchString" HorizontalAlignment="Left" Width="100" Height="30" Grid.Row="0" PreviewKeyDown="tt_PreviewKeyDown"></TextBox>
        <StackPanel Orientation="Horizontal" Grid.Row="1"  Height="45" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="190">

            <Button Content="OK" 
                Height="25" Margin="10,10,10,10" Width="75" Name="btnOK" TabIndex="1600" IsDefault="True" Click="btnOK_Click"                        
                VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />
            <Button Content="Cancel" 
                Height="25" Margin="10,10,10,10" Width="75" Name="btnCancel" TabIndex="1700" IsCancel="True" 
                VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="btnCancel_Click" />
        </StackPanel>
    </Grid>

背後にあるコード

private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = true; 
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e)
        {
           if (e.Key == Key.Enter)
           {
               this.Search();
               e.Handled = true;
           }
        }
8

wpfのダイアログウィンドウを閉じる組み込みの方法はありません。あなたがしなければならないことは、デフォルトのボタンのDialogResultを設定することです。したがって、必要なのは次のとおりです。

xaml

<Button Content="OK" 
            Height="25" Margin="10,10,10,10" Width="75" Name="btnOK" TabIndex="1600" IsDefault="True" Click="btnOK_Click"                        
            VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />

コードビハインド:

    private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
    }
8
blindmeis

Close()を呼び出したりPreviewKeyDownを自分で処理したりしないでください。

これを行う適切な方法は、[OK]/[キャンセル]ボタンを用意し、Button.IsDefaultButton.IsCancel、およびWindow.DialogResultを使用することです。テキストボックスで「Enter」キーの押下が処理されていない場合、キーの押下はWindowに伝播され、デフォルトのボタンが押されます。


MyForm.xaml:

<Button x:Name="btnOk" Content="Ok" Click="btnOk_Click" IsDefault="True"/>
<Button x:Name="btnCancel" Content="Cancel" Click="btnCancel_Click" IsCancel="True"/>

MyForm.xaml.cs:

private void btnOk_Click(object sender, RoutedEventArgs e)
{
    DialogResult = true;
}

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
    DialogResult = false;
}

フォームのanyテキストボックスでEnterキーまたはEscキーを押すと、フォームが閉じます(適切な結果が得られます)

AcceptButtonメンバーをボタンプロパティ名に設定するだけです。

AcceptButton = btnOK;   // button used when ENTER is pressed
0
Kevin M. Miller