[WPF] ContextMenu heeft soms lang nodig

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
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:
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 ( 8)7 ) 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:
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!

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Werkt hier natuurlijk gewoon zonder delay zoals verwacht. Heb je een minimale case/stukje xaml waarbij het fout gaat? :p Is de cpu-belasting maximaal?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Rutix
  • Registratie: Augustus 2009
  • Laatst online: 05-09-2024
Werkt hier ook prima. Heb je een testcase waar je het mee krijgt?

Nothing to see here!


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Nou, ik heb even tijd gehad om een test case te maken, en het was makkelijker dan ik dacht om het probleem te reproduceren... Het lijkt er op dat er toch iets aan mijn kant fout is want ik kan me niet voorstellen dat er iets mis is met mijn code in deze simpele test case.

Het is niet eens waard een project te gaan zippen en uploaden; start gewoon een nieuw WPF 4.0 project, en voeg een DataGrid toe aan het MainWindow met een ContextMenu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Window x:Class="ContextMenuTestCase.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

        <DataGrid x:Name="grid" ContextMenuOpening="grid_ContextMenuOpening">
            <DataGrid.ContextMenu>
                <ContextMenu x:Name="menu">

                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>
        
    </Grid>
</Window>


En in de code-behind de bekende methode:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        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 hetzelfde resultaat, waar me trouwens nu ook aan opviel dat je niet perse een item hoeft te klikken, gewoon ergens in de DataGrid met de linkermuis knop klikken (bijvoorbeeld om het menu te sluiten) is genoeg, daarna zal er een delay optreden bij het opnieuw openen van het menu.

Je kunt deze stappen volgen:
1. Rechtermuisknop: menu toont zonder delay (klopt)
2. Rechtermuisknop ergens anders in DataGrid: menu toont opnieuw zonder delay (klopt)
3. Linkermuisknop (ofwel in DataGrid of op een menu item): menu verdwijnt (klopt - de items doen niks)
4. Rechtermuisknop: menu toont na een delay van ~ 5 seconden (fout...)
5. Rechtermuisknop ergens anders in DataGrid: menu toont weer meteen zonder delay

Elke keer dat ik het menu open nadat ik een linkermuis klik heb uitgevoerd komt deze delay er in voor. Dit is dus in een geheel standaard window, zonder third party controls ofzo (geen AvalonDock meer dus), en ik doe nergens iets met een linkermuis klik event ofzo... Ik snap het niet meer :)

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Ik heb ooit ook zo iets meegemaakt...heel raar misschien maar toen ik de virus scan uitschakelde was het probleem weg. Ik weet alleen niet meer of ik toen mcfee of avg draaide...na goed je kunt het eens proberen.

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
vorlox schreef op vrijdag 30 december 2011 @ 20:21:
Ik heb ooit ook zo iets meegemaakt...heel raar misschien maar toen ik de virus scan uitschakelde was het probleem weg. Ik weet alleen niet meer of ik toen mcfee of avg draaide...na goed je kunt het eens proberen.
Ik heb AVG, en heb hem tijdelijk uitgeschakeld (dat is een optie), en dat helpt niet. Ik weet niet of ik AVG op een andere manier echt uit kan zetten (zelfs het proces killen werkt niet, binnen een paar seconden is hij weer terug). Zou het ook wel heel vreemd vinden hoor, maar goed, ik vind het nu al vreemd 8)7

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik krijg met jou testcase niet hetzelfde resultaat. Het menu blijft snel openen.

Win7 64b
Visual Studio Ultimate 2010SP1

Gebeurt het alleen vanuit VS of ook als je hem stand-alone draait?

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
P_de_B schreef op vrijdag 30 december 2011 @ 22:00:
Ik krijg met jou testcase niet hetzelfde resultaat. Het menu blijft snel openen.

Win7 64b
Visual Studio Ultimate 2010SP1

Gebeurt het alleen vanuit VS of ook als je hem stand-alone draait?
Goeie vraag... Het gebeurt alleen vanuit de debugger, als ik hem vanuit VS start. Als ik gewoon de executable start werkt het wel normaal. Dat is in ieder geval een opluchting, dan zal m'n applicatie straks dus wel gewoon werken, maar het is wel irritant zeg.

Enig idee waar het aan kan liggen? VS opnieuw installeren is natuurlijk altijd een optie maar die laat ik nog even wachten, ik was binnenkort toch van plan een complete format te doen dus dan neem ik dat toch in een keer mee.

Ik heb overigens Win7 64bit en VS Professional 2010 SP1 (er staat in ieder geval SP1Rel achter het versie nummer in het About scherm, maar ik kan me eerlijk gezegd niet herinneren dat ik SP1 geinstalleerd heb).

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik durf helaas niet te zeggen waar het aan kan liggen. Ik zou idd VS eens opnieuw installeren aangezien het aan VS lijkt te liggen en niet aan jouw code.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 11-09 16:42

beany

Meeheheheheh

Ik heb hele gekke dingen gezien met WPF. Laatste geval:

Het openen van een dropdown duurde een eeuwigheid op 1 specifieke PC. Alle andere PC's ging goed. Debug of Release maakte niet uit. Gekste dingen geprobeerd, niks deed het oplossen.

Uiteindelijk gevonden: na het deinstalleren van de Bamboo drivers ( http://www.wacom.eu/index2.asp?pid=294&lang=en&gm=1 ) werkte het ineens goed!

Ofterwel: het kan in de gekste hoekjes zitten. Al denk ik in dit geval dat een herinstallatie van VS2010 niet zal helpen(gut feeling).

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 23:02

BM

Moderator Spielerij
Dat vind ik nieteens zoooo onverklaarbaar. Die bamboo drivers doen natuurlijk een en ander qua touch interface in windows. Dat WPF daar van over de zeik raakt is natuurlijk niet goed, en mijn 1e keus zou het ook niet zijn, maar er zou best een link kunnen liggen tussen die 2 :)

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Dat zou ook nog wel eens kunnen, ik heb ook zo'n Wacom tablet en dus ook de drivers. Maar dan zou ik het wel raar vinden dat het alleen tijdens debug gebeurd. Ach, een probleem voor 2012 dan maar :p

Mijn iRacing profiel

Pagina: 1