72

自分のウィンドウを自分のアプリケーションでのみ、他のすべてのウィンドウの上に表示したい。ウィンドウの TopMost プロパティを設定すると、すべてのアプリケーションのすべてのウィンドウの上に表示されるので、それは望ましくありません。

4

19 に答える 19

52

ウィンドウの所有者プロパティを設定する必要があります。

メイン ウィンドウをブロックするために showdialog を介してウィンドウを表示するか、通常のウィンドウを表示して、所有者をブロックせずに所有者の上に表示することができます。

ここにコードビハインド部分のコード例があります - 私はすべての明白なものを省きました:

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();
    }
  }
}
于 2012-06-18T18:40:27.233 に答える
17

代わりに、常に TopMost になる Popup を使用し、それを Window のように装飾し、アプリケーションに完全にアタッチして、メイン Window の LocationChanged イベントを処理し、Popup の IsOpen プロパティを false に設定することができます。

編集:

私はあなたがこのようなものを望んでいることを願っています:

    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();
    }

それが役に立てば幸い!!!

于 2010-03-30T16:16:50.537 に答える
14
CustomWindow cw = new CustomWindow();

cw.Owner = Application.Current.MainWindow;

cw.ShowInTaskbar = false;

cw.ShowDialog() ; 
于 2012-03-27T07:18:27.627 に答える
11

XAMLで簡単に実行でき、誰もこの回答をまだ投稿していないことに驚きました。次の例では、Windowが a で定義されていますResourceLibrary( に注目してください) が、スタンドアロンスタイルの WPF リソースx:Keyでこの XAML バインディングを使用することもできます。Page

<Window x:Key="other_window" 
        Topmost="{Binding Source={x:Static Application.Current},Path=MainWindow.IsActive,Mode=OneWay}">
    <TextBlock Text="OTHER WINDOW" />
</Window>
于 2016-07-04T21:21:00.957 に答える
5

Activate() メソッドを使用します。これは、ウィンドウを前面に移動してアクティブにしようとします。例 Window wnd = new xyz(); wnd.Activate();

于 2010-12-06T16:40:23.980 に答える
5

ポップアップ ウィンドウで、メソッド 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)
于 2011-10-28T19:31:50.583 に答える
4

私はあなたと非常によく似た状況に遭遇しました。私が遭遇した検索のほとんどは、私がする必要があるのは、メインウィンドウまたは Show を呼び出したウィンドウに一番上にしたいウィンドウの所有者を設定することだけであると述べています。

とにかく、私は先に進み、私にとってうまくいった解決策を投稿します.

アプリケーションに関して最上位にあるはずのウィンドウで、Window.Activated および Window.Deactived のイベント ハンドラーを作成しました。

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)

于 2011-08-01T16:01:18.207 に答える
4

最善の方法は、この 2 つのイベントをアプリのすべてのウィンドウに設定することです。

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;
}
  • そして確かに、あなたがトップにしたかったすべてのウィンドウは、あなたのアプリの他のウィンドウからアクセスできるはずです. 私の場合、ベース ウィンドウと、ベース ウィンドウの上部に配置する必要がある別のウィンドウがあるため、これはベース ウィンドウに別のウィンドウのインスタンスがあることには問題ありませんでした。
于 2011-10-31T06:43:07.700 に答える
2

私はOPです。いくつかの調査とテストの後、答えは次のとおりです。

いいえ、正確にそれを行う方法はありません。

于 2010-04-08T16:15:55.737 に答える
2

いくつかのスレッドがあり、「最上位」タグさえあります。それを検索するか、良さそうなこの投稿に直接アクセスしてください。

自分のアプリケーションでのみウィンドウを他のすべてのウィンドウの上に表示する方法は?

于 2010-03-30T15:52:06.360 に答える
1

これを行う方法は次のとおりです。「最上位」ウィンドウを他のウィンドウの GotFocus および LostFocus イベントにサブスクライブさせ、イベント ハンドラーとして次を使用します。

class TopMostWindow
{
    void OtherWindow_LostFocus(object sender, EventArgs e)
    {
        this.Topmost = false;
    }

    void OtherWindow_GotFocus(object sender, EventArgs e)
    {
        this.Topmost = true;
    }
}
于 2010-07-04T19:09:01.413 に答える
0

htisはどうですか:

Private Sub ArrangeWindows(Order As Window())
    For I As Integer = 1 To Order.Length -1
        Order(I).Owner = Order(I - 1)
    Next
End Sub
于 2016-10-15T11:38:49.403 に答える
0

これをWindowsタグに追加できます

WindowStartupLocation="CenterScreen"

次に、続行するためにユーザーに確認してもらいたい場合は、それを表示することもできます

YourWindow.ShowDialog();

最初に TopMost パラメーターなしで試して、結果を確認します。

于 2010-03-30T20:00:14.723 に答える
0

私も同じ問題に直面し、Google に従ってこの質問に回答しました。最近、次のことがうまくいくことがわかりました。

CustomWindow cw = new CustomWindow();
cw.Owner = this;
cw.ShowDialog();
于 2015-06-27T07:48:50.967 に答える
0

これが私を助けたものです:

Window selector = new Window ();
selector.Show();
selector.Activate();
selector.Topmost = true;
于 2019-11-12T17:29:23.607 に答える