2012-10-12 16 views
7

Mam aplikację, która ma główne okno zawierające kilka rzeczy. Od czasu do czasu użytkownik zrobi coś w odpowiedzi, na które chcę wyświetlić coś zupełnie innego w głównym oknie, tymczasowo ukrywając to, co jest.WPF: Ustawianie ostrości klawiatury w kontroli użytkownika? (Problemy z KeyBinding)

Robię to poprzez uczynienie najbardziej zewnętrznego elementu w głównym oknie siatki bez zdefiniowanego wiersza lub kolumny. Każdy element w siatce całkowicie wypełni pojedynczą komórkę w siatce, czerpiąc ją z pozostałych.

Moje zwykłe rzeczy w wiązce znajdują się w pierwszym elemencie siatki, a moje tymczasowe coś innego to UserControl jako drugi element siatki, czyli zwykle ustawiony Visibility = Collapsed.

Z wyjątkiem KeyBinding wszystko działa dobrze. Kiedy odpowiednie polecenie zostanie uruchomione w zwykłym pakiecie rzeczy, widoczność w UserControl jest ustawiona na Visible i całkowicie obejmuje zwykły pakiet rzeczy. Kiedy użytkownik kliknie przycisk zamykania kontrolki UserControl, jego widoczność jest ponownie ustawiona na zwiniętą, a znika i pojawia się regularna wiązka rzeczy.

Mój problem dotyczy KeyBindings. Mam kilka zdefiniowanych w UserControl - które nie powinny być zdefiniowane w głównym oknie - i nie działają. Lub raczej działają dobrze po kliknięciu w UserControl, ale nie działają, dopóki nie zrobię.

Potrzebuję ich do pracy, gdy tylko UserControl stanie się widoczny, bez konieczności klikania lub przechwytywania przez UserControl.

Domyślam się, że ma to coś wspólnego z ustawieniem ostrości na klawiaturze - ale nie byłem w stanie znaleźć sposobu na skupienie się na UserControl. Oto rzecz - jedynym elementem w UserControl jest kontrolka zakładki, której wszystkie zakładki są dynamicznie konstruowane za pomocą szablonów. Nie ma żadnych elementów znanych podczas kompilacji, które można jawnie odwołać i przekazać do KeyBoard.Focus().

Czy mam rację, sądząc, że przyczyną problemu jest brak ostrości? A jeśli tak, to w jaki sposób ustawić fokus na element w TabControl, kiedy nie wiem nawet, ile kart jest tam, nie mówiąc już, który jest wybrany?

+0

dlaczego nie możesz bezpośrednio ustawić kontroli użytkownika. Jak w, Keyboard.Focus (userControl)? –

+0

Świetne pytanie. To nie działa. Mogę wywołać KeyBoard.Focus() na kontrolerze, ale metoda Gotfocus kontrolki nie uruchamia się. –

+1

Ale jeśli ustawię Focusable = "True" na formancie, to robi to. Dziękuję za sprawienie, że zajrzę we właściwe miejsce. –

Odpowiedz

9

Chciałem, aby ta kontrola miała fokus, kiedy stała się widoczna. Tak więc w konstruktorze ustawiłem program obsługi IsVisibleChanged.

public MyControl 
{ 
    ... 
    this.IsVisibleChanged += new DependencyPropertyChangedEventHandler(MyControl_IsVisibileChanged); 
} 

void MyControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (!(bool(e.NewValue) 
     return; 
    this.Focusable = true; 
    Keyboard.Focus(this); 
} 

mógłbym ustawić Regulowana w XAML, ale wolę go w opóźnieniem kodu, tak że wszyscy odpowiedniego kodu jest w jednym miejscu.

Powiązane problemy