2011-08-19 15 views
3

私は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結合のみのソリューションが望ましいです。

答えて

9

パスワードボックスにフォーカスがあるときに、「Caps lock warning」を表示するために、サインインフォームで次の方法を使用しています。

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

ありがとうございます。 – gulbaek

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; 
     } 
    } 

    ... 
} 

PreviewKeyDowntunneling eventです。つまり、要素ツリールート(つまりWindow)のイベントが最初に呼び出された後、イベントツリーに沿ってイベントソースに向かってイベントが移動することを意味します。これは、他のコードによって妨げられることなく、ある場所でcaps lockの状態の変化を検出できるので便利です。

PreviewKeyDownイベントは、caps lock状態の変更に対してのみ応答します。 SetCapsLockOnStateの状態を正しく設定するには、ウィンドウが作成されたときのキャップロック状態と、ウィンドウにフォーカスがないときのキャップロック状態が反映されるようにSetCapsLockState()に電話する必要があります。これらのケースをカバーするためにActivatedイベントを使用することを選択しました。

関連する問題