Il existe deux approches.
Option 1
Vous pouvez placer une fenêtre contextuelle via ses propriétés HorizontalOffset et VerticalOffset. Vous avez juste besoin de travailler sur les valeurs pour les définir. Comme ceci: -
private void Button_Click(object sender, RoutedEventArgs e)
{
Popup popup = new Popup();
Button b = (Button)sender;
GeneralTransform gt = b.TransformToVisual(Application.Current.RootVisual);
Point p = gt.Transform(new Point(0, b.ActualHeight));
popup.HorizontalOffset = p.X;
popup.VerticalOffset = p.Y;
popup.Child = new Border()
{
Child = new TextBlock() { Text = "Hello, World!" },
Background = new SolidColorBrush(Colors.Cyan)
};
}
Ici, nous utilisons la méthode TrannsformToVisual
du bouton pour obtenir une transformation par rapport à la racine de l'application visuelle qui a la même origine que le pop-up aura. En utilisant les boutons hauteur réelle, nous pouvons arriver à un point dans le coin inférieur gauche du bouton.
Option 2
Une alternative est de placer le Popup dans la mise en page.
<StackPanel>
<Button Content="Click Me" Click="Button_Click" />
<Popup x:Name="popup" />
<TextBlock Text="This text will be occluded when the popup is open" />
</StackPanel>
Code
: -
private void Button_Click(object sender, RoutedEventArgs e)
{
popup.Child = new Border()
{
Child = new TextBlock() { Text = "Hello, World!" },
Background = new SolidColorBrush(Colors.Cyan)
};
popup.IsOpen = !popup.IsOpen;
}
Dans cette approche, l'origine du Popup est placé par le système de mise en page, dans ce cas, nous avons utilisé un StackPanel
de sorte que le menu contextuel est placé directement sous le bouton. Cependant, la fenêtre contextuelle n'occupe aucun espace dans la mise en page, de sorte que le bloc de texte apparaît immédiatement sous le bouton.
Désolé, pas une réponse, mais: Pour l'option 2, y a-t-il un moyen de rattraper le popup disparaître après quelques secondes? –
@Phil, faites une animation qui ferme la pop up à la deuxième 5, et jouez-la quand le popup s'ouvre. – Shimmy