Расширение вашего 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 - это событие туннелирования .Это означает, что сначала вызывается событие в корне дерева элементов (т. Е. Window), а затем событие перемещается вдоль дерева элементов в направлении источника события.Это удобно, поскольку мы можем обнаруживать изменения в состоянии блокировки заглавных букв в одном месте, не опасаясь, что этому может помешать другой код.
Событие PreviewKeyDown реагирует только на изменения в состоянии заглавных букв.Вам нужно вызвать SetCapsLockState()
, чтобы правильно установить состояние SetCapsLockOnState
, чтобы отразить состояние блокировки заглавных букв при создании окна, и если состояние блокировки заглавных букв изменяется, когда окно не имеет фокуса.Я решил использовать событие «Активировано», чтобы охватить оба этих случая.