我正在构建一个应用程序。我在Button
上有一个Window
。当我点击Button
时,我想要
弹出一个新的Window
。但是,新的Window
必须在Button
下打开。另一种方法是,当Window
弹出时,Button
必须显示在Window
上。我怎样才能做到这一点?这可能吗?
提前致谢。莉莉
我的代码如下:
private void Topics_Click(object sender, RoutedEventArgs e)
{
TreeView tree = new TreeView();
tree.Top = 250;
tree.Left = 30;
tree.Show();
}
答案 0 :(得分:0)
Lilly公司,
这是一个类,可以帮助您放置相对于您希望的控件的任何窗口。
using System.Windows;
public static class WindowHelper
{
public static void PlaceWindow(this Window window, FrameworkElement control)
{
if(window == null || control == null) return;
var point = control.PointToScreen(new Point(control.ActualWidth, control.ActualHeight));
window.Top = point.Y;
window.Left = point.X;
}
}
只需将其添加到您的某个帮助程序库中,并将其包含在您要使用的代码中。
这是一个用法示例。
private void Button_Click(object sender, RoutedEventArgs e)
{
var button = e.OriginalSource as Button;
if (button == null) return;
var window2 = new Window2();
window2.PlaceWindow(button);
window2.ShowDialog();
}
这里发生的是,在Button Click事件中,我将创建一个新窗口“Window2”并使用上面的扩展方法相对于按钮放置窗口(在这种情况下,触发了click事件的按钮)然后显示新窗口。您会注意到新窗口将放置在按钮的最右下角。您可以进行一些调整,以便新窗口可以放在按钮的中心底部。像这样修改代码:
public static class WindowHelper
{
public static void PlaceWindow(this Window window, FrameworkElement control)
{
var point = control.PointToScreen(new Point(control.ActualWidth/2.0, control.ActualHeight));
window.Top = point.Y;
window.Left = point.X - (window.Width/2.0);
}
}
我希望这是您正在寻找的解决方案。
修改强>
对不起,我的答案可能有点过于精心满足您的需求。这是在您的上下文中实现所需内容的更简单方法。
private void Topics_Click(object sender, RoutedEventArgs e)
{
TreeView tree = new TreeView();
FrameworkElement control = e.OriginalSorce as FrameworkElement;
if(control != null)
{
var point = control.PointToScreen(new Point(control.ActualWidth, control.ActualHeight));
tree.Top = point.Y;
tree.Left = point.X;
}
tree.Show();
}
答案 1 :(得分:0)
基本上,wpf在添加它们时对FrameworkElements进行了命令,因为您在添加树视图之前添加了按钮,它在顶部可见。您需要更改排序。
在将按钮添加到布局之前,您应该添加树视图。
然后在TreeView上执行tree.Visibility = Windows.Visibility.Hidden(在xaml或代码中)。
单击按钮时更新树视图的值,然后执行tree.Visibility = Windows.Visibility.Visible
我认为你真的不想要一个窗口,你只需要一个面板来显示按钮后面出现的其他一些控件。在此之下是代码。
此处更新示例:
Xaml:
<Grid>
<Grid Visibility="Hidden" Background="black" Name="popupGrid" Width="300" HorizontalAlignment="Left" Margin="60.018,124.323,0,38.583">
<TextBlock Padding="10,10,5,5" TextWrapping="Wrap" Foreground="White" TextTrimming="None">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce ut urna sit amet eros accumsan tristique. Integer sed odio velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec eget odio fringilla odio varius ultricies. Nullam scelerisque tellus vitae mauris accumsan consectetur rutrum et turpis. Proin eget blandit tellus. Mauris adipiscing consequat cursus. Morbi eu tortor metus. Fusce nec rutrum eros. Duis congue elementum risus, sit amet fermentum elit rhoncus dignissim. Suspendisse aliquet felis nec sem venenatis mattis.
</TextBlock>
</Grid>
<Button Click="Button_Click" Content="Show!" Height="36.586" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="71.45" Margin="37.154,0,0,12"></Button>
</Grid>
然后在Button_Click处理程序中:
private void Button_Click(System.Object sender, System.Windows.RoutedEventArgs e) { if (sender != null) { if (popupGrid.Visibility == Windows.Visibility.Visible) { popupGrid.Visibility = Windows.Visibility.Hidden; } else { popupGrid.Visibility = Windows.Visibility.Visible; } } }
答案 2 :(得分:0)
查看this blog on controlling the z-order元素。
通过将弹出窗口的zindex设置为小于按钮的zindex,它应该显示在它后面。