代码之家  ›  专栏  ›  技术社区  ›  Sylvain

如何使WPF窗口位于我的应用程序的所有其他窗口之上(不是系统范围的)?

  •  52
  • Sylvain  · 技术社区  · 16 年前

    我希望我的窗户在所有其他窗户的上面 仅在我的应用程序中 . 如果我设置了一个窗口的最上面的属性,那么它将位于所有应用程序的所有窗口的最上面,我不希望这样。

    18 回复  |  直到 16 年前
        1
  •  50
  •   Johannes    10 年前

    下面是代码隐藏部分的代码示例—我忽略了所有明显的内容:

    namespace StackoverflowExample
    {
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
        void NewWindowAsDialog(object sender, RoutedEventArgs e)
        {
          Window myOwnedDialog = new Window();
          myOwnedDialog.Owner = this;
          myOwnedDialog.ShowDialog();
        }
        void NormalNewWindow(object sender, RoutedEventArgs e)
        {
          Window myOwnedWindow = new Window();
          myOwnedWindow.Owner = this;
          myOwnedWindow.Show();
        }
      }
    }
    
        2
  •  17
  •   Community Mohan Dere    5 年前

    我希望你想要这样的东西:

        Window1 window;
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            window = new Window1();
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Topmost = true;
            this.LocationChanged+=OnLocationchanged;
            window.Show();
        }
         
        private void OnLocationchanged(object sender, EventArgs e)
        {
              if(window!=null)
                  window.Close();
        }
    

    希望有帮助!!!

        3
  •  12
  •   Juan Mellado user183856    14 年前
    CustomWindow cw = new CustomWindow();
    
    cw.Owner = Application.Current.MainWindow;
    
    cw.ShowInTaskbar = false;
    
    cw.ShowDialog() ; 
    
        4
  •  10
  •   Glenn Slayden    9 年前

    很容易做到 ,惊讶的是还没有人发布这个答案。在下面的示例中 Window 定义在 ResourceLibrary (注意 x:Key ),但您也可以在单机版上使用此XAML绑定 Page -样式WPF资源。

    <Window x:Key="other_window" 
            Topmost="{Binding Source={x:Static Application.Current},Path=MainWindow.IsActive,Mode=OneWay}">
        <TextBlock Text="OTHER WINDOW" />
    </Window>
    
        5
  •  5
  •   Sudhakar Singh    15 年前

    使用Activate()方法。这将尝试将窗口置于前台并激活它。 e、 g.窗口wnd=新xyz(); wnd.Activate();

        6
  •  4
  •   Ashley Grenon    14 年前

    我遇到了和你非常相似的情况。大部分 searches 我遇到一个声明,我需要做的就是把我希望成为最上面的窗口的所有者设置到主窗口或任何叫Show的窗口。

    不管怎样,我会继续发布一个对我有效的解决方案。

    我为Window.Activated和Window.deactivated创建了事件处理程序,该窗口应该是我的应用程序的最顶层。

    private void Window_Activated(object sender, EventArgs e)
    {
        Topmost = true;
    }
    
    private void Window_Deactived(object sender, EventArgs e)
    {
        if(Owner == null || Owner.IsActive)
            return;
        bool hasActiveWindow = false;
        foreach(Window ownedWindow in Owner.OwnedWindows)
        {
            if(ownedWindow.IsActive)
                hasActiveWindow = true; 
        }
    
        if(!hasActiveWindow)
            Topmost = false;
    }
    

    它对我很有用。希望这对其他人有用(o)

        7
  •  4
  •   Eric Tremblay    14 年前

    在弹出窗口中,用参数重载方法Show():

    Public Overloads Sub Show(Caller As Window)
        Me.Owner = Caller
        MyBase.Show()
    End Sub
    

    然后在主窗口中,调用重载方法Show():

    Dim Popup As PopupWindow
    
    Popup = New PopupWindow
    Popup.Show(Me)
    
        8
  •  4
  •   Omid.Hanjani    14 年前

    最好的方法是将这两个事件设置到应用程序的所有窗口:

    GotKeyboardFocus
    LostKeyboardFocus
    

    WiondowOfMyApp_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
        windowThatShouldBeTopMost.TopMost = true;
    }
    
    WiondowOfMyApp_LostKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
        windowThatShouldBeTopMost.TopMost = false;
    }
    
    • 当然,所有你想成为顶级的窗口,都应该可以从你应用程序的其他窗口访问。 在我的例子中,我有一个基本窗口和另一些应该在我的基本窗口顶部的窗口,所以这对我的基本窗口来说是不错的,每个窗口都有一个实例。
        9
  •  2
  •   Community Mohan Dere    9 年前

    有几个线程,甚至有一个“最上面的”标签。在上面搜索,或者直接转到这个看起来不错的帖子:

    How to keep a window on top of all other windows in my application only?

        10
  •  2
  •   Sylvain    16 年前

    我是执行官。经过一些研究和测试,答案是:

    不,没有办法 确切地

        11
  •  1
  •   Juan Campa    15 年前

    下面是一种方法:使“最顶层”窗口订阅其他windows GotFocus和LostFocus事件,并使用以下事件处理程序:

    class TopMostWindow
    {
        void OtherWindow_LostFocus(object sender, EventArgs e)
        {
            this.Topmost = false;
        }
    
        void OtherWindow_GotFocus(object sender, EventArgs e)
        {
            this.Topmost = true;
        }
    }
    
        12
  •  0
  •   paradisonoir    16 年前

    WindowStartupLocation="CenterScreen"
    

    然后,如果您希望用户确认它以便继续,您也可以显示它

    YourWindow.ShowDialog();
    

    首先在没有最顶层参数的情况下尝试,然后查看结果。

        13
  •  0
  •   Avi Rob Spoor    12 年前

    Popup.PlacementTarget = sender as UIElement;
    
        14
  •  0
  •   Error404 Pasa89    9 年前

    Private Sub ArrangeWindows(Order As Window())
        For I As Integer = 1 To Order.Length -1
            Order(I).Owner = Order(I - 1)
        Next
    End Sub
    
        15
  •  0
  •   wonea Ilya Smagin    8 年前

    我也面临着同样的问题,跟着谷歌问这个问题。最近我发现下面的方法对我很有效。

    CustomWindow cw = new CustomWindow();
    cw.Owner = this;
    cw.ShowDialog();
    
        16
  •  0
  •   Meloviz    8 年前

    private void SplashScreen_ContentRendered(object sender, EventArgs e)
    {
        // User authentication...
        // ...
    
        MainWindow mainWindow = new MainWindow();
        SetBinding(SplashScreen.TopmostProperty, new Binding("IsVisible"))
        {
            Source = mainWindow,
            Mode = BindingMode.OneWay,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };
        mainWindow.Show();
    }
    

        17
  •  0
  •   John B    8 年前

    刚学C#就遇到了类似的情况。但找到了一个我认为可能有用的解决办法。你可能早就知道了。这将是从开始一个新的项目,但你可以在任何地方使用它。

    1) 启动新项目。

    2) 转到Project,然后选择New Windows form,然后选择Windows form和name Splash。

    3) 根据需要设置大小、背景、文本等。

    4) 在Splash.cs窗体的属性下,设置“开始位置:中间屏幕”和“最顶端:true”

    5) 表格1增加“使用系统线程

    6) 类add“splashscreen=new Splash();”下的form1

    7) form1添加“splashscreen.Show();”和“Application.DoEvents();”

    9) Splash.cs add在“Public Splash”下添加“this.BackColor=Color.Aqua;”/可以用任何颜色

    10) 这是Form1.cs的代码

    public partial class Form1 : Form
    {
        Splash splashscreen = new Splash();
        public Form1()
        {
            InitializeComponent();
            splashscreen.Show();
            Application.DoEvents();
    
        }
    
        private void Form1_Activated(object sender, EventArgs e)
        {
            Thread.Sleep(4000);
            splashscreen.Close();
        }
    }
    

    11) 这是Splash.cs上的代码

    public partial class Splash : Form
    {
        public Splash()
        {
            InitializeComponent();
            this.BackColor = Color.Aqua;
        }
    }
    

    12) 我发现如果你不在splash中做一些事情,那么屏幕就不会在第一个窗体需要激活的时间停留在顶部。

        18
  •  0
  •   Eric Aya    7 年前

    我也遇到了同样的问题,在使用MVVM设置所有者时遇到了问题,同时也没有导致应用程序在生产中崩溃。我有一个窗口管理器视图模型,其中包含一个使用窗口的uri打开窗口的命令—如果应用程序没有崩溃,我无法将所有者设置为App.MainWindow。

    所以呢- 我没有设置所有者,而是将窗口的最顶层属性绑定到窗口管理器视图模型中的一个属性,该属性指示应用程序当前是否处于活动状态。如果应用程序是活动的,窗口在顶部,我想。如果它不活动,其他窗口可以覆盖它。

    以下是我添加到视图模型中的内容:

     public class WindowManagerVM : GalaSoft.MvvmLight.ViewModelBase
        {
            public WindowManagerVM()
            {
                App.Current.Activated += (s, e) => IsAppActive = true;
                App.Current.Deactivated += (s, e) => IsAppActive = false;
            }
    
            private bool _isAppActive = true;
            public bool IsAppActive
            {
                get => _isAppActive;
                set
                {
                    if (_isAppActive != value)
                    {
                        _isAppActive = value;
                        RaisePropertyChanged(() => IsAppActive);
                    }
                }
            }
        }
    

    下面是实现它的XAML(我使用MVVM light和ViewModelLocator作为应用程序Locator中的静态资源):

    <Window Topmost="{Binding WindowManager.IsAppActive, Source={StaticResource Locator}}"/>
    
        19
  •  0
  •   Fernando Santiago    6 年前

    这就是帮助我的原因:

    Window selector = new Window ();
    selector.Show();
    selector.Activate();
    selector.Topmost = true;