2010-09-13 69 views
3

我尝试使用链接按钮单击事件来创建具有某些数据列表的弹出式窗口。但弹出窗口的默认位置是整个浏览器窗口的左上角。如何在silverlight 4的click事件中定位popup?

看来不同的控件需要不同的方式来定位弹出。像Image控件与LeftButtondown/up事件将不同于button/link按钮的click事件。

如何在链接按钮下方设置弹出位置?

回答

10

有两种方法。

选项1

您可以通过其Horizo​​ntalOffset和VerticalOffset性质定位的弹出。你只需要制定设置它们的值。像这样的: -

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) 
     }; 
    } 

这里我们使用按钮TrannsformToVisual方法来获取相对于应用程序根视觉这具有弹出式将具有相同起源的变换。使用按钮的实际高度,我们可以到达按钮左下角的一个点。

选项2

另一种方法是放置在弹出的布局。

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

代码: -

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; 
    } 

在该方法中弹出的原点由布局系统放置,在这种情况下,我们已经使用了一个StackPanel所以弹出窗口位于正下方的按钮。然而,弹出窗口不占用布局中的任何空间,因此文本块将立即出现在按钮下方。

+0

对不起,没有答案,但是:对于选项2,有几种方法可以让弹出窗口在几秒后消失? – 2010-10-19 07:03:32

+0

@Phil,制作一个动画,关闭第二个5的弹出窗口,并在弹出窗口打开时播放它。 – Shimmy 2012-03-27 20:07:59