2009-12-23 6 views
4

Existe-t-il des contrôles de fonctionnement pour WPF?Piemenu for WPF

+0

Pouvez-vous être un peu plus clair? Voulez-vous dire un contrôle de camembert? – ChrisF

+1

Je pense qu'il veut dire menu de tarte, comme dans http://en.wikipedia.org/wiki/Pie_menu – Grokys

Répondre

3

Je l'ai trouvé dans mon préféré, vous pouvez jeter un oeil à:

This

ont une belle journée.

+0

Note: Ce contrôle ne supporte qu'un seul niveau d'un menu circulaire. – Kelly

3

Cette question est probablement longue morte, mais juste une note que le contrôle Thomas M posté, tout génial, a un problème majeur: Vous devez passer la souris et cliquez sur l'élément réel au lieu de la tranche de tarte. Cela signifie que les tranches de tarte ne sont pas complètement adjacentes et que l'IMO supprime une grande partie de la cliquabilité (loi de Frits) des avantages du contrôle. Donc, alors qu'il ressemble comme un menu de tarte, il positionne vraiment tout radialement.

Je fini par faire ceci:

private static Path makeDeliciousKeyLimePieSlice(double innerRadius, double outerRadius, 
     double startAngle, double endAngle, Vector ofs) 
    { 
     Point p1 = new Point(Math.Cos(endAngle) * innerRadius, Math.Sin(endAngle) * innerRadius) + ofs; 
     Point p2 = new Point(Math.Cos(startAngle) * innerRadius, Math.Sin(startAngle) * innerRadius) + ofs; 
     Point p3 = new Point(Math.Cos(startAngle) * outerRadius, Math.Sin(startAngle) * outerRadius) + ofs; 
     Point p4 = new Point(Math.Cos(endAngle) * outerRadius, Math.Sin(endAngle) * outerRadius) + ofs; 
     PathFigure fig = new PathFigure(p1, new PathSegment[] { 
      new ArcSegment(p2, new Size(innerRadius, innerRadius), endAngle - startAngle, false, SweepDirection.Counterclockwise, true), 
      new LineSegment(p3, true), 
      new ArcSegment(p4, new Size(outerRadius, outerRadius), startAngle - endAngle, false, SweepDirection.Clockwise, true), 
     }, true).GetAsFrozen(); 
     return new Path { Data = new PathGeometry(new[] { fig }).GetAsFrozen() }; 
    } 

Cela va créer une « tranche » de la tarte. Vous pouvez le style comme vous voulez si vous voulez un vrai menu de tarte. Une autre option consiste à le rendre transparent (définir le remplissage à Brushes.Transparent, doit avoir un remplissage à être hit-test visible), ce qui semble bon pour les menus contextuels radiaux. Voici mon WIP après le travail d'environ une demi-heure (je sais l'espacement suce):

alt text http://public.blu.livefilestore.com/y1pdW5ibqWquKGosMSch9C5KmOTKkiZ35mAI7iFKKUKf3cm7TGSquXhO8hkkL9Ln6Z3tKn74u67C27Qb_AIWQxzhg/radial.png?psid=1

EDIT: ah; le curseur n'apparaît pas dans la photo - en fait, si vous utilisez la superposition de chemins, vous pouvez placer la souris en dehors du contrôle réel tout en la mettant en surbrillance.

+0

Belle solution! J'ai dû enlever .GetAsFrozen() parce que les données de chemin ont besoin de l'objet de géométrie et de Freezable sont héritées par la géométrie, pas l'inverse. (en utilisant .NET 4.5) –

1

Ce contrôle nécessite un peu de travail, mais c'est un excellent point de départ et prend en charge plusieurs niveaux d'éléments. (ie: une hiérarchie) Check it out here