Autor Beitrag
Vertax
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 27.05.11 16:58 
Hallo Community,
ich habe ein kleines Problem mit einem User-Control und dem Tastaturfokus.

Ich habe ein Hauptprogramm in dem ich ein Grid habe. In dieses Grid lade ich dann ein Usercontrol zur Laufzeit ein. Dieses UserControl stellt mein Menü dar.
Das ganze mache ich über folgenden Code im Loaded ereigniss meinem Hauptprogramm:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
 TVControls.MenueDisplay Menue = new TVControls.MenueDisplay(ref MainGrid, DisplayList);
            Menue.Height = MainGrid.Height;
            Menue.Width = MainGrid.Width;
            Grid.SetRow(Menue, 2);
            MainGrid.Children.Add(Menue);
            FocusManager.SetIsFocusScope(Menue, true);
            FocusManager.SetFocusedElement(Menue, Menue);


In meinem User Control habe ich 1 Kreis der in 4 Tortenstücke aufgeteilt ist. Jedes dieser Tortenstücke soll ein Menüeintrag representieren. Jetzt möchte ich natürlich das ich beim Laden gleich das Tortenstück1 als ausgewählt also auf Focus setze.

Dieses Problem konnte ich mit dem Loaded Event des UserControls umgehen.


Mein anderes Problem befindet sich innerhalb des userControls.
Ich möchte wenn Tortenstück1 auf Focus ist das KeyDown Event überprüft ob Pfeiltaste Rechts oder Links gedrückt wurde, um ein Storyboard auszuführen.
Das Storyboard wechselt dann Optisch von Kuchenstück1 zu Kuchenstück2.
Danach soll der Focus auch auf Kuchenstück 2 liegen.

mein Code ist wie folgt:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
       private void Teil1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Right)
            {
                var Control = Resources["FirstRight"as Storyboard;
                Control.Begin();
                
                Keyboard.Focus(Teil2);
               
            }
            else if (e.Key == Key.Left)
            {
                var Control = Resources["FourthLeft"as Storyboard;
                Control.Begin();
            
                Keyboard.Focus(Teil4);
            }
        }

        private void Teil2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Right)
            {
                var Control = Resources["SecondRight"as Storyboard;
                Control.Begin();

                FocusManager.SetIsFocusScope(MainGrid, true);
                FocusManager.SetFocusedElement(MainGrid, Teil3);

            }
            else if (e.Key == Key.Left)
            {
                var Control = Resources["SecondLeft"as Storyboard;
                Control.Begin();
              
                Keyboard.Focus(Teil1);
            }
        }
        
        private void Teil3_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Right)
            {
                var Control = Resources["ThirdRight"as Storyboard;
                Control.Begin();
               
                Keyboard.Focus(Teil4);
            }
            else if (e.Key == Key.Left)
            {
                var Control = Resources["ThirdLeft"as Storyboard;
                Control.Begin();
              
                Keyboard.Focus(Teil2);
            }
        }

So wenn ich beim Kuchenstück1 anfange klappt alles wunderbar. Er führt die Animation aus und setzt den Focus auf Kuchenstück2. Wenn ich dann wieder Pfeiltasterechts drücke springt er auch in Teil2_KeyDown und führt die zweite Animation aus und setzt den Focus auf Kuchenstück 3.


Und jetzt tritt das Problem auf:
Kuchenstück3 bekommt zwar kurz den Focus, doch dieser springt wieder zurück zu Kuchenstück2. Das verstehe ich überhaupt nicht wieso bei Kuchestück1 zu 2 alles funktioniert aber bei 2 zu 3 er wieder zurückspringt nachdem 3 denn Fokus bekommen hat.


Ich habe mal das User Control und das Main Programm als Anhang drangehängt. Über Hilfe wäre ich sehr dankbar.

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Einloggen, um Attachments anzusehen!
Vertax Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 27.05.11 17:46 
Also ich habe nun eine möglichkeit gefunden das ganze zu umgehen.
Das Problem liegt anscheinend am sender oder dem KeyDown Event.
Wenn ich den Focus nämlich über das Storyboard Completet erst setze funktioniert es.

Ich wäre trotzdem noch froh wenn mir jemand erklären würde wieso das hier der Fall ist.