2017-12-18 2 views
0

私はそれをクリックしてOnScreenKeyboardを表示するTextBox UserControlを持っています。 OnScreenKeyboardを開始し、私のTextBoxの分離コードは次のようになります。セルフメイドのOnScreenKeyboardは反応するために2番目のタップが必要です

private void TextBoxText_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      TextBox textbox = sender as TextBox; 
      US_Keyboard keyboardWindow = new US_Keyboard(textbox, Window.GetWindow(this)); 
      if (keyboardWindow.ShowDialog() == true) 
       textbox.Text = keyboardWindow.InputSource.Text; 
     } 

OnScreenKeyboardは、Windowから継承する部分クラスです。 OnScreenKeyboardのコンストラクタは次のようになります。

public US_Keyboard(TextBox owner, Window wndOwner) 
    { 
     InitializeComponent(); 
     this.Owner = wndOwner; 
     this.DataContext = this; 

     //Delete text in textbox 
     if (InputSource.Text.Length > 0) 
     { 
      OldTextBoxValue = InputSource.Text; 
      InputSource.Text = ""; 
     } 

     //Set caret to start point of textbox 
     AdornerLayer layer = AdornerLayer.GetAdornerLayer(owner); 
     CaretAdorner adorner = new CaretAdorner(owner); 
     adorner.OffsetX = _CaretOffsetXDefault; 
     layer.Add(adorner); 
     _adorner = adorner; 
     _layer = layer; 

     SetKeyboardSize(); 
     SetKeyboardPosition(); 
    } 

これまでのところ、すべては一つのことを除いて、正常に動作します:OnScreenKeyboard-ウィンドウが表示された後、それが反応する第2のタップを必要とします。それはフォーカスがないように見え、フォーカスを得るためには1回のクリックが必要です。どうすればこの問題を解決できますか?

私はすでにコンストラクタで次のことを試してみましたが、それは助けにはならない:

this.Focus(); 
+0

[WPFウィンドウセットフォーカス](https://stackoverflow.com/questions/6395645/wpf-window-set-focus)の可能な複製 – Mahmoud

+0

同じ質問のように聞こえるが、解決策は私のためには機能しない –

+1

フォーカスを必要としているのをもっと心配しています...オンスクリーンキーボードは、主要な入力フォーカスが入力を受け取る別のアプリケーションにとどまっている間にマウスのクリックを受け取ることによって理想的には動作しませんか? – grek40

答えて

0

あなたは、Win32 APIを使用することを検討することができます

using System; 
using System.Windows; 
using System.Windows.Interop; 
using System.Runtime.InteropServices; 

namespace YourSolution 
{ 
    static class WindowExtensions 
    { 
     [DllImport("User32.dll")] 
     internal static extern bool SetForegroundWindow(IntPtr hWnd); 

     public static void SetFocus(this Window window) 
     { 
      var handle = new WindowInteropHelper(window).Handle; 
      SetForegroundWindow(handle); 
     } 
    } 
} 

ウィンドウを集中したいときは、window.SetFocus();を使用。
注:SetFocusに電話する前に、フォーカスを当てるウィンドウをロードする必要があります。

+0

なぜ私はwin32 apiの使用を検討すべきですか? –

+0

@jimmmmyjoooあなたは 'Focus'メソッドがうまくいかないと言ったからです。このAPIはそれほど複雑ではありませんが、なぜ試してみませんか? –

+0

win32 apiを使用しても役に立ちません –

関連する問題