C# 绑定到Caps锁
我正在WPF中构建一个登录屏幕。我正试图找出如何将代码的一部分绑定到只有当caps lock键打开时才可见C# 绑定到Caps锁,c#,wpf,C#,Wpf,我正在WPF中构建一个登录屏幕。我正试图找出如何将代码的一部分绑定到只有当caps lock键打开时才可见 <StackPanel Grid.Row="3" Grid.ColumnSpan="2" Grid.Column="1" Orientation="Horizontal"> <Image Source="../../../Resources/Icons/109_AllAnnotations_Warning_16x16_72.png" Height="16"
<StackPanel 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>
帽子锁打开了
我更喜欢只使用xaml绑定的解决方案。我们在登录表单中使用以下方法,在密码框有焦点时显示“大写锁定警告”
private void PasswordBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
UpdateCapsLockWarning(e.KeyboardDevice);
}
private void PasswordBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
UpdateCapsLockWarning(e.KeyboardDevice);
}
private void PasswordBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
CapsLockWarning.Visibility = Visibility.Hidden;
}
private void UpdateCapsLockWarning(KeyboardDevice keyboard)
{
CapsLockWarning.Visibility = keyboard.IsKeyToggled(Key.CapsLock) ? Visibility.Visible : Visibility.Hidden;
}
但这并不是您想要的唯一答案。在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>
这是一个很好的例子。这意味着首先调用元素树根(ie窗口)处的事件,然后事件沿着元素树向事件源移动。这很方便,因为我们可以在一个位置检测到对caps lock状态的更改,而不用担心这可能会受到其他代码的干扰
PreviewKeyDown事件仅响应caps lock状态的更改。您需要调用SetCapsLockState()
以正确设置SetCapsLockOnState
的状态,以反映创建窗口时的caps锁定状态,以及窗口没有焦点时caps锁定状态是否发生更改。我选择使用激活事件来涵盖这两种情况
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;
}
}
...
}