我正在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绑定的解决方案。
答案 0 :(得分:9)
我们在登录表单中使用以下方法,以便在密码框具有焦点时显示“大写锁定警告”。
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;
}
不是您正在寻找的仅限绑定的答案。
答案 1 :(得分: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是tunneling event。这意味着首先调用元素树根(即Window)处的事件,然后事件沿元素树向事件源移动。这很方便,因为我们可以在一个地方检测到大写锁定状态的变化,而不用担心这可能会受到其他代码的干扰。
PreviewKeyDown事件仅响应大写锁定状态的变化。您需要调用SetCapsLockState()
以正确设置SetCapsLockOnState
的状态以反映创建窗口时的大写锁定状态,以及当窗口没有焦点时大写锁定状态更改。我选择使用Activated事件来涵盖这两种情况。