如何在Silverlight 4中通过单击事件定位弹出窗口?

4

我试图使用链接按钮的点击事件来创建一个带有一些数据列表的弹出窗口,但是弹出窗口的默认位置是整个浏览器窗口的左上角。

看起来不同的控件需要不同的方法来定位弹出窗口。例如,Image控件的LeftButtondown/up事件与按钮/链接按钮的click事件不同。

如何将弹出窗口的位置设置在链接按钮正下方?

1个回答

11

有两种方法。

选项1

您可以通过设置弹出窗口的HorizontalOffset和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,所以弹出窗口直接放置在按钮下方。但是,弹出窗口不占用布局空间,所以文本块会立即出现在按钮下方。

抱歉,这不是一个答案,但是:对于选项2,有没有办法让弹出窗口在几秒钟后消失? - user480142
@Phil,请制作一个动画,在第5秒关闭弹出窗口,并在弹出窗口打开时播放它。 - Shimmy Weitzhandler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接