Avatar billede MikkelNielsen Nybegynder
10. august 2010 - 11:05 Der 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å.

Ideas anyone?
Avatar billede heinzdmx Nybegynder
10. august 2010 - 12:29 #1
Måske lave en override af SplitContainerns onKeyPress funcktion?
Avatar billede MikkelNielsen Nybegynder
10. august 2010 - 13:46 #2
Jeg prøvede det her:


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. :(
Avatar billede MikkelNielsen Nybegynder
10. august 2010 - 17:42 #3
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. :)
Avatar billede heinzdmx Nybegynder
10. august 2010 - 17:46 #4
Super :D
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester