绑定到大写锁定键

4

我正在使用 WPF 构建登录界面。我想知道如何绑定代码的一部分,仅在大写锁定键开启时显示。

<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绑定的解决方案。
2个回答

10
我们在登录表单中使用以下方法,在密码框获取焦点时显示“大写锁定警告”。
    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;
    }

不过这并不是你正在寻找的仅限于绑定的答案。


0
扩展你的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 是一个隧道事件。这意味着在元素树的根节点(即窗口)中首先调用事件,然后事件沿着元素树向事件源移动。这很方便,因为我们可以在一个地方检测大写锁定状态的更改,而不必担心其他代码会干扰它。

PreviewKeyDown 事件仅响应大写锁定状态的更改。您需要调用 SetCapsLockState() 来正确设置 SetCapsLockOnState 的状态,以反映窗口创建时的大写锁定状态,以及当窗口没有焦点时大写锁定状态发生更改时。我选择使用 Activated 事件来处理这两种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接