2017-01-27 25 views
0

WPFアプリケーションでは、実装認証ロジックが必要です:ユーザーがログインしている場合にのみ、ダイアログボックスで特定のテキストボックスを編集できる必要があります。私が欲しいもの入力フォーカスの変更をキャンセルするにはどうすればよいですか?

は、次の動作です:

  1. ユーザーがログインしている場合、彼はテキストボックスをクリックして、いつものように、その内容を編集 を開始することができます。

  2. ユーザーがログインしていない場合でも、ユーザーはテキストボックスをクリックできるはずですが、ログインダイアログが表示されるはずです。 ログインダイアログを完了した後、彼はテキストボックスに戻り、今度は 編集モードに戻るはずです。ユーザーは(ログインせずに)ログイン・ダイアログをキャンセルした場合

  3. 、入力フォーカスは、テキストボックスの内容を編集してから彼を防ぐため、 に をテキストボックスを含むダイアログの[キャンセル]ボタンを移動する必要があります。

    private void TextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
        { 
         bool loggedIn = ExecuteLogin(); //shows the login dialog and returns new login status 
    
         if (!loggedIn) 
         { 
          CancelButton.Focus(); 
          e.Handled = true; 
         } 
        } 
    

    それは確かに限り、ユーザがログイン手続きを完了したが、彼は代わりに、ログインダイアログをキャンセルした場合、それとして正常に動作しない:私はPreviewGotKeyboardFocusイベントにこの方法をフックしようとしている

入力フォーカスをキャンセルボタンに転送しません。さらに、イベントハンドラは複数回呼び出され(ダイアログ内のテキストボックスごとに1回)、システム全体が混乱しているように見えます(アプリケーションが終了するとアプリケーションのプロセスは終了しません。

必要な動作を得るために変更する必要はありますか?

答えて

1

次のサンプルコードは私の期待どおりに動作します。途中でTextBoxをクリックし、ダイアログで "No"と答えて[Enter]を押します。

WPF Button to have Keyboard focus (dotted border around) during the startup or activation of window

ます。また、常にに覚えておく必要があります:あなたがキーボードを使って、ボタンに移動している場合は点線のフォーカスボーダーが意図的にのみ示されていること

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private bool _handleEvent = true; 
    private void TextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
    { 
     if (!_handleEvent) 
      return; 

     bool loggedIn = ExecuteLogin(); //shows the login dialog and returns new login status 

     if (!loggedIn) 
     { 
      CancelButton.Focus(); 
      e.Handled = true; 

     } 
    } 

    public bool ExecuteLogin() => MessageBox.Show("Login?", "", MessageBoxButton.YesNo) == MessageBoxResult.Yes; 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("click"); 
    } 
} 

<StackPanel> 

    <TextBox /> 
    <TextBox PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" /> 
    <TextBox /> 

    <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" /> 
</StackPanel> 

注意質問をするときに、最小、完全、および検証可能な例を作成します。https://stackoverflow.com/help/mcve

+0

あなたの上質な答えをありがとうございました。私はあなたのコード例を使用し、それは魅力のように動作します。ありがとうございました。 –

0

私はGotFocusイベントを使うべきだと思います。

いつもダイアログを開いてコードで閉じようとするのではなく、すぐにログ情報を取得できない場合は、ユーザーがログオンしていないかどうかを確認してください。

関連する問題