C# 绑定到Caps锁

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"

我正在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" 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;
        }
    }

    ...
}