Laden...

[erledigt] Fokus innerhalb eines Containers "gefangen halten"

Erstellt von Matscher vor 12 Jahren Letzter Beitrag vor 12 Jahren 729 Views
Matscher Themenstarter:in
84 Beiträge seit 2008
vor 12 Jahren
[erledigt] Fokus innerhalb eines Containers "gefangen halten"

Hallo zusammen,

ich habe mir ein Programm zusammen geschustert.
Darin habe ich eine eigene MessageBox-Klasse eingebaut, bei dieser wird das Fenster nicht außerhalb des Hauptfensters angezeigt, sondern innherlab dieses. Also es legt sich einfach als Layer vor die anderen Controls.

Ich hab das Ganze jetzt soweit ausgebaut, dass es auch als "modal" aufgerufen werden kann, also dass auf das Fenster gewartet wird.

Da sich ein halbtransparentes Control vor die anderen Controls legt, kann man nicht mehr auf die anderen klicken. Nur noch auf die, der MessageBox und so soll das auch sein. Nur weis das eben der Tastaturfokus nicht. Mit der Tab-Taste konnte man locker und lässig über den OK-Button nach "draußen" in eine TextBox (bspw!) gehen.

Dies hab ich jetzt verhindert, in dem ich alle Controls des Hauptfensters Focusable auf False setze.

Dazu iteriere ich alle Controls und deren Childs mit dem VisualTreeHelper.


/// <summary>
/// Setzt die Elemente auf dem Hautpefnster als nicht-fokusierbar.
/// </summary>
private void SetNotFocusable( UIElement parentElement )
{
	if ( this._focusableElements == null )
		this._focusableElements = new List<UIElement>();

	int childCount = VisualTreeHelper.GetChildrenCount( parentElement );

	for ( int i = 0; i < childCount; i++ )
	{
		UIElement child = VisualTreeHelper.GetChild( parentElement, i ) as UIElement;
		if ( child != null )
		{
			if ( child.Focusable )
			{
				this._focusableElements.Add( child );
				child.Focusable = false;
			}
		this.SetNotFocusable( child );
	}
}
		}

Anschließend wird die Liste mit den eben gesperrten Elementen wieder auf True gesetzt.

Prinzipiel funktioniert das. Nur erscheint mir das zu unsicher.
Gibt es da nicht eine schönere Variante? Irgendwas mit dem FocusManager oder der KeyboardNavigation.

Ich hab ein wenig mit der Funktionen dieser Klassen rumgespielt, doch so wirklich funktioniert hat's nicht.

Also meine Frage: Gibt es eine Möglichkeit, den Fokus, wenn er sich einmal in einem bestimmten Container-Control befindet nur noch innerhalb dieses zu belassen?

Gruß,
Matscher

P
660 Beiträge seit 2008
vor 12 Jahren

Diese MessageBox-Klasse ist das ein UserControl oder WindFrom? in beiden fällen
kannst du das LostFocus-Event abonnieren und den Fokus dann wieder auf die MessageBox setzen.

vllt wäre es auch eine Option das Parent-Fenster (also das Fenster über dem die MessageBox ist) zu Disablen (Enabled = false) und beim schließen das wieder zurückzusetzen

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

Matscher Themenstarter:in
84 Beiträge seit 2008
vor 12 Jahren

Die MessageBox ist ein UserControl.

Ich hatte da jetzt bei LostFocus geguckt. Da reagiert gar nichts. Also mit der Tab-Taste wird LostFocus hier irgendwie nicht ausgeführt. Zumindest nicht für die MessageBox-Klasse selbst (nur eben für die darunter liegenden Controls).

Aber da gibt es ja noch dieses OnLostKeyboardFocus. Das reagiert dann zwar schon wieder etwas zu viel. D.h. bei jeder Tab-Tasten-Navigation, die auch innerhalb des UserControls statt findet, wird diese Methode ausgeführt. Allerdings bringt sie eine OldFocus und NewFocus -Eigenschaft mit.

Ich guck jetzt einfach ob NewFocus als Parent irgendwo die MessageBox hat. Wenn ja: Alles OK. Wenn nicht: Wird der Fokus auf das erste Control mit Focusable=True gesetzt.

Funktioniert. Vielen Dank für den kleinen Tipp!

Gruß, Matscher