Witam. Jak rozwiązać następujący problem. Mam kilka textboxów do wpisywania danych ale założenie jest takie, ze komputer nie ma klawiatury i wpisywanie danych muszę oprogramować. W poprzedniej wersji aplikacji (WinForms) to zrobiłem sobie usercontrol z buttonami jako klawisze. Zaczytywałem wszystkie pola textowe i miałem zawsze jedno oznaczone jako aktywne . Przy kliknięciu na textboxa Focus się zmieniał. A chcąc coś pisać wywoływałem dla każdego klikniętego buttona metode SendKeys.Send(moja literka). Gdzie moja literka była zapisana we właściwości tag button. I to mogłem odczytać bez problemu i dobrze to działa. Przed sendkeys miałem jeszcze wywoływany focus na aktualnym textboxie bo inaczej nic tam się nie pojawiało. To samo chciałbym zrobić w WPF i jeszcze używając MVVM. Niestety klasa nie mogę użyć w WPF klasy SendKeys. Ale ściągnąłem z NuGeta InputSimulation i wywołuje w metodzie takie polecenia
InputSimulator inp= new InputSimulator();
KeyboardSimulator keyb = new KeyboardSimulator(inp);
keyb.KeyPress(WindowsInput.Native.VirtualKeyCode.VK_A);
Nie wiem czy to tak powinno wyglądać ale to raczej nie zadziała jak nie będę ustawiał focusa na wybranym textboxie. (Tak jak wyżej robiłem to w winformsach).
Bo jak klikam buttona to textbox automatycznie traci focus i nic się nie pojawia. A w Winforms robiłem to tak:
public void MyButtonClick(object sender, EventArgs e)
{
Button button = sender as Button;
AddKeyboard.SetFocus(); // focus na aktualny textbox
SendKeys.Send(button.Tag.ToString());
}
Jak focusować ostatnio wybrany textbox.
Oczywiście używanie klawiatury systemowej odpada
Takie coś mi przyszło do głowy:
Robisz MVVM, więc te Twoje TextBoxy są do czegoś zbindowane.
Idea: jak textbox dostaje focusa, to bierzesz propertisa do którego zbindowany jest textbox, i bindujesz go do swojej wirtualnej kalwiatury żeby wiedziała gdzie dodawać
zalety: zero zabawy z focusem
jak to zrobić : Attached Properties
problem : trzeba będzie jeszcze śledzić pozycję karetki w textboxie, jeśli edycja ma nastepować nie tylko na końcu
alternatywnie do Attached Properties podziedziczyć po TextBoxsie, wtedy dostęp do pozycji karetki powinnien być łatwiejszy
Też tak myślałem ale nie wiem jak się dostać do propertiesa do którego jest zbindowany text box i gdzie go zapisać. Tzn mógłbym po focusie do jakiegoś pola, po focusie na textboxie, jego zbingowane property name. i za pomocą refleksji dostać się do tego pola. Tylko jak w dependency prop odczytaj zbindowane property