2017-12-18 3 views
0

Ich habe ein TextBox UserControl, das ein OnScreenKeyboard zeigt, indem ich darauf klicke. Die Codebehind meiner TextBox, die die OnScreenKeyboard beginnt wie folgt aussieht:Selfmade OnScreenKeyboard benötigt zweites Tippen, um zu reagieren

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

Die OnScreenKeyboard eine partielle Klasse ist, die aus Fenster erbt. Der Konstruktor der OnScreenKeyboard sieht wie folgt aus:

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

Bisher funktioniert alles einwandfrei, bis auf eine Sache: Nach dem OnScreenKeyboard-Fenster erscheint, braucht es einen zweiten Hahn zu reagieren. Es sieht so aus, als hätte es keinen Fokus und benötigt einen Klick, um den Fokus zu bekommen. Wie kann ich das beheben?

Ich habe bereits versucht, die folgenden in den Konstruktor, aber es hilft nicht:

this.Focus(); 
+0

Mögliche Duplikate von [WPF Fenster Set Fokus] (https://Stackoverflow.com/questions/6395645/wpf-window-set-focus) – Mahmoud

+0

Es klingt wie die gleiche Frage, aber die Lösung funktioniert nicht für mich –

+1

Ich wäre mehr besorgt über Fokus benötigt ... sollte nicht eine Bildschirmtastatur funktionieren idealerweise durch Empfangen von Mausklicks, während der primäre Eingabefokus in einer anderen Anwendung bleibt, die die Eingabe erhält? – grek40

Antwort

0

Sie betrachten können 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); 
     } 
    } 
} 

Wenn Sie ein Fenster konzentrieren möchten, verwenden Sie window.SetFocus(); .
Hinweis: Das Fenster, das Sie fokussieren möchten, muss geladen sein, bevor Sie SetFocus anrufen.

+0

Warum sollte ich Win32 api verwenden? –

+0

@jimmmmyjooo Weil du gesagt hast, dass die 'Focus' Methode nicht funktioniert hat. Diese API ist nicht sehr komplex, warum nicht ausprobieren? –

+0

mit win32 api hilft nicht –

Verwandte Themen