【问题标题】:Set WindowStartupLocation to the Margin.Top of Button1 of the main window将 WindowStartupLocation 设置为主窗口 Button1 的 Margin.Top
【发布时间】:2011-11-08 20:53:26
【问题描述】:

我正在做一个项目,每当用户将按钮悬停在主窗口上时,我都必须添加一个小的预览窗格和一个关于框。

例如:我有一个窗口 - preview.xaml,我的主窗口名为 MainWindow.xaml。

如何将预览窗口底部设置为显示在 MainWindow 上 button1 的顶部?

我尝试了这样的事情没有任何运气:

public preview()
{
   InitializeComponent();
   this.WindowStartupLocation = WindowStartupLocation.Manual;
   Top = mainWindow.button1.Margin.Top;
}

我希望我的胡言乱语有任何意义......

非常感谢任何帮助!

【问题讨论】:

  • 几个问题:显示预览的代码在哪里? mainWindow.button1.Margin.Top 实际上有什么价值?相对于您希望它出现的位置,您的窗口实际出现在哪里?
  • 显示预览的代码是在 MainForm 上的 MouseEnter 事件期间,它只是:preview.show();。预览窗口当前显示在最左侧的顶部。

标签: c# wpf


【解决方案1】:

您需要将LeftTop 窗口属性设置为屏幕坐标,按钮边距在此无济于事。使用PointToScreen函数获取按钮的屏幕坐标:

    private void button1_MouseEnter(object sender, MouseEventArgs e)
    {
        var control = ((FrameworkElement)sender);
        // get screen coordinates of (0,0) point of button
        var location = control.PointToScreen(new Point(0, 0));
        var w = new preview()
        {
            WindowStartupLocation = System.Windows.WindowStartupLocation.Manual,
            ShowActivated = false,
        };
        w.Top = location.Y - w.Height;
        w.Left = location.X + (control.ActualWidth - w.Width) / 2;
        w.Show();
    }

【讨论】:

  • 甜蜜!这正是我正在寻找的。谢谢楼主!
【解决方案2】:

你必须反过来做。在您打开预览窗口的 MainWindow 中执行以下操作:

PreviewWindow preview = new PreviewWindow
{
     Owner = this,
     WindowStartupLocation = WindowStartupLocation.Manual,
     Top = button1.Margin.Top
};
preview.Show();

如果你想重用那个窗口,你必须做一些逻辑。

【讨论】:

  • hmm,窗口仍然在屏幕最左侧的顶部打开。如果我将 'Top = button1.Margin.Top' 更改为 'Top = button1.Margin.Bottom' 窗口会稍微靠右。
  • @RobinNilsson:啊,我错过了这一点。您必须获取绝对屏幕坐标。您可以使用PointToScreen(new Point(button.Margin.Left, button.Margin.Top)); 获取屏幕坐标
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多