モーダルダイアログとして開くWPFwindow
があります。
ダイアログには、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
}
}
あなたのコードは私にとってはうまく機能しています。 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;
}
}
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;
}
Close()
を呼び出したりPreviewKeyDown
を自分で処理したりしないでください。
これを行う適切な方法は、[OK]/[キャンセル]ボタンを用意し、Button.IsDefault
、Button.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