10. august 2010 - 11:05Der er
3 kommentarer og 1 løsning
Håndtering af input i Windows forms
Hej,
Jeg har et problem, som burde være banalt, men som ikke desto mindre driller mig en del.
Jeg er ved at lave en form for animationseditor i C#, og på min form har jeg en SplitContainer og endnu en SplitContainer ovenpå. Så har jeg et par ComboBoxes og en PictureBox, som er det område, hvorpå brugeren kan placere animationsobjekter og ændre dem. Det skal være muligt at klikke på et objekt og dermed vælge det og så bruge cursor-tasterne til at flytte det rundt med.
På min form har jeg sat this.KeyPreview = true og cursortast-håndteringen sker i min KeyPress event handler. Det virker også - sådan da! Det valgte objekt flytter sig godt nok MEN jeg kan konstatere, at en af mine SplitContainers også får tastetrykket. Hvis jeg trykker én gang på fx cursor left, så flytter SplitContaineren sig (altså den der divider, som brugeren kan trække rundt med, hvis han vil ændre lidt på UI'en). Hvis jeg trykker igen, et det det valgte objekt, der flytter sig.
Jeg forstår ikke, hvorfor SplitContaineren reagerer på tastetryk - og kun det første. Den må jo nødvendigvis have fokus for at kunne det, men hvordan forhindrer jeg det? Muligvis smide en eller anden usynlig control på, som får key-eventet, smider det videre til min handler og derpå consumer det, så SplitContaineren ikke får det... Men det virker lidt hacky.
Jeg har også puslet med tanken om at override ProcessCmdKey() og lave al inputhåndtering dér, men det virker bare ikke som den rigtige måde at gøre det på.
class UserSplitContainer : SplitContainer { protected override void OnKeyPress( KeyPressEventArgs e ) { e.Handled = true; base.OnKeyPress( e ); }
protected override void OnKeyDown( KeyEventArgs e ) { e.Handled = true; base.OnKeyDown( e ); }
protected override void OnKeyUp( KeyEventArgs e ) { e.Handled = true; base.OnKeyUp( e ); } }
Og udskiftede mine split containers med UserSplitContainer. Jeg kan konstatere, via breakpoints, at ovenstående metoder bliver kaldt af frameworket, men selvom jeg sætter handled til true, så er problemet der stadigvæk. :(
Nå, nu fik jeg det endelig til at virke. Det var et spørgsmål om at sætte focus på det SplitPanel, der ejer det andet, som igen ejer comboboxes og picturebox. Da jeg gjorde det, virkede formens KeyPreview lige pludselig som det skulle. :)
Så selv om dit forslag ikke hjalp mig direkte, var det noget, der bestemt var værd og prøve, og desuden gav det mig en del inspiration, som jeg kunne komme videre med.
Hvis du smider et svar, skal jeg nok kvittere for det. :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.