按Enter键时如何关闭WPF窗口(对话框)?

时间:2011-09-22 05:49:10

标签: c# wpf xaml wpf-controls wpfdatagrid

我有一个WPF window,它作为模态对话框打开。

在对话框中,我有OK&带有Cancel&的IsDefault按钮IsCancel属性分别为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
    }
}

4 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:7)

您的代码对我来说很好。按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;
           }
        }

答案 2 :(得分:6)

您不应该自己致电Close()或处理PreviewKeyDown

执行此操作的正确方法是使用“确定/取消”按钮,然后使用Button.IsDefaultButton.IsCancelWindow.DialogResult。如果&#39;输入&#39;按键未在文本框中处理,按键将传播到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;
}

现在在表单中的任何文本框中输入或转义将关闭表单(具有正确的结果)

答案 3 :(得分:0)

只需将AcceptButton成员设置为按钮属性名称。

AcceptButton = btnOK;   // button used when ENTER is pressed