我尝试使用链接按钮单击事件来创建带有一些数据列表的弹出窗口。但是弹出窗口的默认位置是整个浏览器窗口的左上角。
似乎不同的控件需要不同的方式来定位弹出窗口。像使用LeftButtondown / up事件的图像控件与按钮/链接按钮的点击事件不同。
如何在链接按钮下设置弹出位置?
答案 0 :(得分: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
方法获取相对于应用程序root visual的转换,该转换与popup具有相同的原点。使用按钮实际高度,我们可以到达按钮左下角的一个点。
选项2
另一种方法是将Popup放在布局中。
<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
,因此弹出窗口直接放在按钮下方。但是弹出窗口不会占用布局中的任何空格,因此文本块会出现在按钮的正下方。