2010-09-13 5 views
3

J'essaie d'utiliser l'événement de clic de bouton de lien pour créer un popup avec une certaine liste de données. Mais la position par défaut de la popup est en haut à gauche de la fenêtre entière du navigateur.Comment positionner popup dans un événement click avec silverlight 4?

Il semble que le contrôle différent nécessite une autre manière de positionner le popup. Comme le contrôle Image avec l'événement LeftButtondown/up serait différent de l'événement click pour le bouton button/link.

Comment régler la position de popup directement sous le bouton de lien?

Répondre

10

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.

+0

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? –

+0

@Phil, faites une animation qui ferme la pop up à la deuxième 5, et jouez-la quand le popup s'ouvre. – Shimmy

Questions connexes