Привязать к Caps Lock - PullRequest
       3

Привязать к Caps Lock

3 голосов
/ 19 августа 2011

Я строю экран входа в 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.

Ответы [ 2 ]

9 голосов
/ 19 августа 2011

Мы используем следующий подход в нашей форме входа в систему, чтобы показать «Предупреждение о блокировке Caps», когда поле пароля имеет фокус.

    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 голосов
/ 12 ноября 2012

Расширение вашего 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, чтобы отразить состояние блокировки заглавных букв при создании окна, и если состояние блокировки заглавных букв изменяется, когда окно не имеет фокуса.Я решил использовать событие «Активировано», чтобы охватить оба этих случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...