Hoi,
Ik ben aan een WPF applicatie (in C#) aan het werken en ben tegen een vreemd probleem aangelopen. Ik heb een DataGrid met een leeg ContextMenu genaamd 'menu'. Dit menu wordt gevuld in de ContextMenuOpening event van de DataGrid met een aantal items (stuk of 10). Ik merk nu echter dat het af en toe heel lang duurt (~5 seconden) voordat het menu getoond wordt na een rechtermuisklik. Dit gebeurt echter enkel nadat ik een van de MenuItems heb aangeklikt. Als ik het menu open en er vervolgens niks mee doe dan krijg ik geen delay, hoe vaak ik het menu ook open. Zodra ik echter een Item aan klik en daarna opnieuw het menu probeer te openen zit er een delay van 5 seconden tussen.
Ik had verschillende ideeën waar het aan kon liggen:
1. Het duurt lang om de 10 items toe te voegen.
2. Er gebeurt iets vreemds in de MenuItem click event handler
3. Er zit iets mis in een Style die ik gebruik
Ik heb deze alle 3 eenvoudig kunnen testen en hier ligt het niet aan. Ik heb nu om te testen het volgende menu:
De ContextMenuOpening event handler voegt gewoon 10 lege items toe zonder Click handlers:
Dit geeft exact hetzelfde effect - geen delay totdat ik op een item click (wat dus niks uithaalt, er zijn geen click event handlers), waarna het 5 seconden duurt voordat het menu weer verschijnt.
Ik weet even niet meer wat ik nog kan proberen. Ik heb zitten googlen op WPF ContextMenu delay en dergelijke maar ik kan vrij weinig vinden, het enige wat ik kan vinden is mensen die 10.000 items aan hun menu toevoegen (
) wat lang duurt. In mijn geval zit de delay NIET in het toevoegen van de items, de grid_ContextMenuOpening method wordt pas aangeroepen NA de delay van 5 seconden...
Misschien is het nog relevant dat deze DataGrid in een UserControl zit, die weer als Content van een DockableContent zit in een DockManager van AvalonDock (wat misschien bekend is).
Volgens mij is de tree ongeveer zoiets:
Maar dit is volgens mij een vrij standaard layout met AvalonDock, ik kan hier niets vreemds aan vinden.
Ten slotte werkt alles wel naar behoren als ik de items in het ContextMenu 'hardcode' in de XAML zet (wat in mijn geval geen optie is, de items moeten dynamisch bepaald worden zodra het menu geopend wordt). Als ik in plaats van een leeg menu gewoon wat <MenuItem Header="A" /> erin zet, dan is er geen delay, ook niet na een klik op een item. Het ContextMenuOpening event van de DataGrid wordt nog steeds afgehandeld, maar ik doe daar dan niks meer in (code in commentaar).
Snapt iemand wat er aan de hand is en hoe ik dit verhelp? Bedankt!
Ik ben aan een WPF applicatie (in C#) aan het werken en ben tegen een vreemd probleem aangelopen. Ik heb een DataGrid met een leeg ContextMenu genaamd 'menu'. Dit menu wordt gevuld in de ContextMenuOpening event van de DataGrid met een aantal items (stuk of 10). Ik merk nu echter dat het af en toe heel lang duurt (~5 seconden) voordat het menu getoond wordt na een rechtermuisklik. Dit gebeurt echter enkel nadat ik een van de MenuItems heb aangeklikt. Als ik het menu open en er vervolgens niks mee doe dan krijg ik geen delay, hoe vaak ik het menu ook open. Zodra ik echter een Item aan klik en daarna opnieuw het menu probeer te openen zit er een delay van 5 seconden tussen.
Ik had verschillende ideeën waar het aan kon liggen:
1. Het duurt lang om de 10 items toe te voegen.
2. Er gebeurt iets vreemds in de MenuItem click event handler
3. Er zit iets mis in een Style die ik gebruik
Ik heb deze alle 3 eenvoudig kunnen testen en hier ligt het niet aan. Ik heb nu om te testen het volgende menu:
code:
1
2
3
4
5
6
7
| <DataGrid ContextMenuOpening="grid_ContextMenuOpening"> <DataGrid.ContextMenu> <ContextMenu x:Name="menu"> </ContextMenu> </DataGrid.ContextMenu> </DataGrid> |
De ContextMenuOpening event handler voegt gewoon 10 lege items toe zonder Click handlers:
C#:
1
2
3
4
5
6
7
8
| private void grid_ContextMenuOpening(object sender, ContextMenuEventArgs e) { menu.Items.Clear(); for (int i = 1; i < 10; i++) { menu.Items.Add(new MenuItem {Header = i.ToString()}); } } |
Dit geeft exact hetzelfde effect - geen delay totdat ik op een item click (wat dus niks uithaalt, er zijn geen click event handlers), waarna het 5 seconden duurt voordat het menu weer verschijnt.
Ik weet even niet meer wat ik nog kan proberen. Ik heb zitten googlen op WPF ContextMenu delay en dergelijke maar ik kan vrij weinig vinden, het enige wat ik kan vinden is mensen die 10.000 items aan hun menu toevoegen (

Misschien is het nog relevant dat deze DataGrid in een UserControl zit, die weer als Content van een DockableContent zit in een DockManager van AvalonDock (wat misschien bekend is).
Volgens mij is de tree ongeveer zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <Window> <DockingManager> <ResizingPanel> <DockablePane> <DockableContent> <UserControl> <DataGrid ... /> </UserControl> </DockableContent> </DockablePane> </ResizingPanel> </DockingManager> </Window> |
Maar dit is volgens mij een vrij standaard layout met AvalonDock, ik kan hier niets vreemds aan vinden.
Ten slotte werkt alles wel naar behoren als ik de items in het ContextMenu 'hardcode' in de XAML zet (wat in mijn geval geen optie is, de items moeten dynamisch bepaald worden zodra het menu geopend wordt). Als ik in plaats van een leeg menu gewoon wat <MenuItem Header="A" /> erin zet, dan is er geen delay, ook niet na een klik op een item. Het ContextMenuOpening event van de DataGrid wordt nog steeds afgehandeld, maar ik doe daar dan niks meer in (code in commentaar).
Snapt iemand wat er aan de hand is en hoe ik dit verhelp? Bedankt!