代码之家  ›  专栏  ›  技术社区  ›  Nathan Wheeler

新窗口在当前窗口下打开

  •  0
  • Nathan Wheeler  · 技术社区  · 15 年前

    我在代码中构建了一个窗口,显示:

    Window wndViewer = new Window();
    wndViewer.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(0xFF, 0x31, 0x31, 0x31));
    wndViewer.WindowState = WindowState.Maximized;
    wndViewer.Width = 1024;
    wndViewer.Height = 768;
    
    Grid grd = new Grid();
    
    wndViewer.Title = "<Removed>";
    
    Viewer vw = new Viewer(); // This is a UserControl
    vw.StudyDate = ((StudyItem)sender).StudyDate.ToString("MM/dd/yyyy");
    vw.PatientName = ((StudyItem)sender).PatientName;
    vw.PatientId = ((StudyItem)sender).OwnerName;
    
    vw.Margin = new Thickness(3, 30, 3, 3);
    vw.StudyInstance = ((StudyItem)sender).ItemStudy;
    grd.Children.Add(vw);
    
    wndViewer.Content = grd;
    
    refreshTimer.Stop();
    
    wndViewer.Tag = vw.StudyInstance;
    
    wndList.Add(wndViewer); // List<Window> of all the windows opened this way.
    
    DependencyObject dpParent = LogicalTreeHelper.GetParent(this);
    
    while (dpParent != null && dpParent.GetType() != typeof(Window))
    {
        dpParent = LogicalTreeHelper.GetParent(dpParent);
    }
    
    wndViewer.Owner = (Window)dpParent;
    
    wndViewer.ShowActivated = true;
    
    wndViewer.Show();
    

    问题是我需要这个窗口显示在当前窗口的顶部,它总是出现在当前窗口的下面。我尝试过几种解决方案:

    wndViewer.BringIntoView();
    

    导入和调用:

    [DllImport("User32.dll")]
    public static extern Int32 SetForegroundWindow(int hWnd);
    
    [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName, string lpWindowName);                       
    

    所以,我肯定我忽略了一些东西。谢谢你的帮助!

    ~md5微米~

    1 回复  |  直到 13 年前
        1
  •  1
  •   ChrisF PerfectlyRock    15 年前

    你试过设置 TopMost 窗口属性?

    您可以在 MSDN

    获取或设置一个值,该值指示窗口是否以最顶端的Z顺序出现。这是依赖属性。

    正如您在评论中指出的,这将使窗口始终是最上面的。在窗口显示后重置标志也是“黑客行为”。

    编辑

    我刚在你的代码中看到你正在设置 Owner 窗口的属性为:

    wndViewer.Owner = (Window)dpParent;
    

    我用过这个,它看起来“只是工作”而已:

    var about = new AboutBox();
    about.Owner = this;
    about.Initialise();
    about.Show(); 
    

    现在在这种情况下 AboutBox 来源于 Window 而不是 UserControl ,所以这里可能有一些东西,但是你有什么理由需要设置吗? 业主 去别的地方 this ?