我试图使用链接按钮的点击事件来创建一个带有一些数据列表的弹出窗口,但是弹出窗口的默认位置是整个浏览器窗口的左上角。
看起来不同的控件需要不同的方法来定位弹出窗口。例如,Image控件的LeftButtondown/up事件与按钮/链接按钮的click事件不同。
如何将弹出窗口的位置设置在链接按钮正下方?
我试图使用链接按钮的点击事件来创建一个带有一些数据列表的弹出窗口,但是弹出窗口的默认位置是整个浏览器窗口的左上角。
看起来不同的控件需要不同的方法来定位弹出窗口。例如,Image控件的LeftButtondown/up事件与按钮/链接按钮的click事件不同。
如何将弹出窗口的位置设置在链接按钮正下方?
有两种方法。
选项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
,所以弹出窗口直接放置在按钮下方。但是,弹出窗口不占用布局空间,所以文本块会立即出现在按钮下方。