はあなたのXAMLに拡大:
<Window x:Class="LoginWindow"
...
Activated="Window_Activated"
PreviewKeyDown="Window_PreviewKeyDown">
...
<StackPanel Name="CapsLockOn" Grid.Row="3" Grid.ColumnSpan="2" Grid.Column="1" Orientation="Horizontal">
<Image Source="../../../Resources/Icons/109_AllAnnotations_Warning_16x16_72.png" Height="16" Width="16"/>
<Label>Caps lock is on</Label>
</StackPanel>
...
</Window>
その後コードで背後:
public partial class LoginWindow : Window
{
...
private void Window_Activated(object sender, EventArgs e)
{
SetCapsLockOnState();
}
private Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
SetCapsLockOnState();
}
private void SetCapsLockOnState()
{
if (Console.CapsLock)
{
CapsLockOn.Visibility.Visible;
}
else
{
CapsLockOn.Visibility.Hidden;
}
}
...
}
PreviewKeyDownはtunneling eventです。つまり、要素ツリールート(つまりWindow)のイベントが最初に呼び出された後、イベントツリーに沿ってイベントソースに向かってイベントが移動することを意味します。これは、他のコードによって妨げられることなく、ある場所でcaps lockの状態の変化を検出できるので便利です。
PreviewKeyDownイベントは、caps lock状態の変更に対してのみ応答します。 SetCapsLockOnState
の状態を正しく設定するには、ウィンドウが作成されたときのキャップロック状態と、ウィンドウにフォーカスがないときのキャップロック状態が反映されるようにSetCapsLockState()
に電話する必要があります。これらのケースをカバーするためにActivatedイベントを使用することを選択しました。
ありがとうございます。 – gulbaek