Avatar billede scorp-d Nybegynder
04. juni 2008 - 14:48 Der er 3 kommentarer og
1 løsning

Lave et klik event ved en User Control(WPF)!

Hej..

Jeg har oprettede en user control hvor jeg gerne vil afgive et event hver gang der bliver trykket på musen inde i den, hvorefter event’et kan se hvem der startede det(knap1, knap2 osv.) Er dette muligt?

Det eneste jeg kan få lov til at lave events på er knapper og ved form load osv. men problemet er at der er en del knapper(24 stk.) så det ville være en lettere hvis man kunne have én event-listner (ligesom i C#.net).

På forhånd tak
Scorp-D
Avatar billede lmoelleb Nybegynder
06. juni 2008 - 12:39 #1
WPF har heldigvis en loesning der er noget bedre end den event listener du efterlyser: Routed Events.

Du kan saette en listener der automatisk haandterer alle events af en bestemt type fra alle subcontrols (uanset hvor dybt de ligger i hirarkiet).

Har du for eksempel et StackPanel i XAML med dine Buttons, saa tilfoejer du bare attributten "Button.Click" hvor du angiver din event handler.

Naturligvis kan du ogsa definere dine egne events istedet for at bruge en standard Click event. Det eneste du lige skal huske er at bruge eventargs.OriginalSource (saa vidt jeg husker) til at finde den Button der blev trykket paa istedet for "sender" som du ville have gjort med de gamle events.
Avatar billede scorp-d Nybegynder
07. juni 2008 - 16:16 #2
Kan ikke helt få det til at virke.

for det første har jeg tilføjet følgende på min stackpanel som indeholder én button:

stPan.MouseDown += new MouseButtonEventHandler(GenericMouseDownHandler);
stPan.MouseRightButtonDown += new MouseButtonEventHandler(GenericMouseDownHandler);

og der er det kun højreklik som giver noget.


for det andet så kan jeg ikke få navnet på det som er blevet klikket på, har prøvet følgende:

String test = ((FrameworkElement)e.OriginalSource).Name; //returnere "";
og
string controlName = ((StackPanel)sender).Name; //returnere stackpanelet's navn


Jeg skal bare have navnet på de(n) knap som bliver trykket på...


Men tusind tak for hjælpen.
Avatar billede lmoelleb Nybegynder
15. juni 2008 - 10:05 #3
Hvorfor prøver du ikke at få det jeg foreslår til at virke, istedet for en eller anden workaround der for det første er langt sværere at programmere, og for det andet aldrig vil virke så godt.

Som allerede sagt:
1) Lav et stack panel (i XAML, hold dig fra at lave det i C# indtil du forstår routed events)
2) Lav dine knapper inde i dit stack panel. Dette kan du gøre fra C# eller XML.
3) Tilføj en attribut til dette stackpanel med navnet "Button.Click" - her definerer du event handleren
4) I C# event handleren "(Button)e.OriginalSource).Name" indeholder navnet.

Det kommer til at se sådan ud:
<Window x:Class="SletMig.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel Button.Click="StackPanel_Click">
        <Button Name="Button1" Content="Button 1" />
        <Button Name="Button2" Content="Button 2" />
    </StackPanel>
</Window>

        private void StackPanel_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(((Button)e.OriginalSource).Name);
        }
Avatar billede scorp-d Nybegynder
17. juni 2008 - 21:09 #4
Var også det jeg endte med at lave....

Tak..
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