Un truc dans ce genre sûrement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class RightClickService
{
public static readonly DependencyProperty ContextMenuTemplateProperty =
DependencyProperty.RegisterAttached("ContextMenuTemplate", typeof(DataTemplate), typeof(RightClickService), null);
public static void SetContextMenuTemplate(UIElement element, DataTemplate value)
{
element.SetValue(ContextMenuTemplateProperty, value);
}
public static DataTemplate GetContextMenuTemplate(UIElement element)
{
return (DataTemplate)element.GetValue(ContextMenuTemplateProperty);
}
} |
1 2 3 4 5 6 7 8 9
| <Image>
<local:RightClickService.ContextMenuTemplate>
<DataTemplate>
<Canvas>
<Button Content="test" />
</Canvas>
</DataTemplate>
</local:RightClickService.ContextMenuTemplate>
</Image> |
Il te faut par contre toujours une méthode pour savoir quel élément a été cliqué. La méthode du MouseEnter parait la mieux.
Tu peux rajouter ça à la casse RightClickService et gérer le MouseEnter/MouseLeave pour tous tes items (c'est pas pratique du tout j'avoue).
public static UIElement CurrentElement { get; set; }
Lorsque tu détectes le clic droit, tu récupères l'élément, tu récupères ensuite son ContextMenuTemplate
DataTemplate template = RightClickService.GetContextMenuTemplate(RightClickService.CurrentElement);
Si il est différent de null, tu l'affiches.
1 2 3 4 5 6
| if (template != null)
{
UIElement ui = template.LoadContent() as UIElement;
LayoutRoot.Children.Add(ui); // a remplacer par ce que tu veux.
} |
Si le DataTemplate est null, tu itères sur le Parent jusqu'à à en trouver un (ou à avoir Parent à null) et tu l'affiches aussi.
Voilà la méthode avec l'Attached Property. Je ne sais pas si c'est la meilleure mais elle doit fonctionner.
Cette technique permet surtout d'avoir des ContextMenu différents selon les éléments.
Partager