2009-05-06 14 views
19

Aktualnie jestem w trakcie tworzenia klawiatury ekranowej. Obsługuję kliknięcie przycisku za pomocą polecenia routedcommands. Problem polega na tym, że po kliknięciu przycisku na panelu klawiatury ostrość przesuwa się do przycisku, a nie do pola tekstowego. Wymóg określa, że ​​kursor powinien zawsze pojawiać się w polu tekstowym, aby wskazać położenie, w którym zostanie wstawiony następny znak. Czy istnieje sposób, że mogę skupić się na polu tekstowym, gdy kliknięto przycisk.Koncentracja kursora na polu tekstowym w WPF/C#

Odpowiedz

32

Aby ustawić logiczną skupienie się do kontroli wejściowej

FocusManager.SetFocusedElement(this, textboxJack);  // set logical focus 

Aby ustawić klawiaturę do sterowania wejściami

Keyboard.Focus(textboxJill);        // set keyboard focus 

znać różnicę między logiczną i klawiatury naciskiem

Input Overview - Focus na MSDN

3

Podoba mi się te do-my-homework -do mnie pytania; "wymóg stwierdza" ... bezcenny. Dla tych, którzy znajdują to za pośrednictwem Google, trik do progresywnego przesuwania kursora w polu tekstowym WPF jest użycie właściwości SelectioNStart.

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    textBox.Focus(); 
    textBox.SelectionStart = textName.Text.Length; 
} 
+31

To nie jest pytanie "do-my-homework-for-me". Jest to pytanie "Odrabiam pracę domową, ale utknąłem, czy ktoś może mi dać jakieś wskazówki". –

2

Sposób w jaki rozwiązałem ten problem polegał na ustawieniu focusable=false na wszystkie przyciski/elementy sterujące na klawiaturze. W ten sposób nie tracisz skupionej na aktualnej kontroli.

1

Twój problem można rozwiązać, używając osobnego zakresu ostrości dla "klawiatury". Wystarczy zastosować następującą właściwość do kontroli, który zawiera wszystkich przycisków i wtedy będą w odrębnym zakresem ostrości i nie będzie miał ostrość ustawiona na nich po kliknięciu

FocusManager.IsFocusScope="True" 
3
Textbox.Focus(); 

ten skupi się na textbox

6

Uzyskaj referencję dla konkretnej kontroli (w tym przypadku TextBox). Po kliknięciu w ten sposób Button_Click wklej:

Dispatcher.BeginInvoke((ThreadStart)delegate 
      { 
       control.Focus(); 
      }); 
+0

dla mnie, po prostu to działa. Dzięki... –

1

musiałem to wykorzystać, aby uzyskać pożądany efekt moja

FocusManager.SetFocusedElement(this, UserNameautoCompleteBox); 

Key key = Key.Enter;     // Key to send 
var target = Keyboard.FocusedElement; // Target element 
RoutedEvent routedEvent = Keyboard.KeyDownEvent; // Event to send 

target.RaiseEvent(
    new KeyEventArgs(
     Keyboard.PrimaryDevice, 
     PresentationSource.FromVisual(UserNameautoCompleteBox), 
     0, 
     key) { RoutedEvent = routedEvent } 
); 
0

chciałem zrobić to samo, ale nic nie wydawało się dla mnie pracować. Naprawdę potrzebowałem odpowiedzi, która działała wyłącznie w XAML, ponieważ pracuję z MVVM.

końcu znalazłem ten przykład: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

i modyfikować je w ten sposób:

W sekcji 'zasobów':

<Style x:Key="FocusTextBox" TargetType="Grid"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True"> 
       <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

W mojej definicji Grid:

<Grid Style="{StaticResource FocusTextBox}" /> 
Powiązane problemy