自分のウィンドウを自分のアプリケーションでのみ、他のすべてのウィンドウの上に表示したい。ウィンドウの TopMost プロパティを設定すると、すべてのアプリケーションのすべてのウィンドウの上に表示されるので、それは望ましくありません。
19 に答える
ウィンドウの所有者プロパティを設定する必要があります。
メイン ウィンドウをブロックするために 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();
}
}
}
代わりに、常に 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();
}
それが役に立てば幸い!!!
CustomWindow cw = new CustomWindow();
cw.Owner = Application.Current.MainWindow;
cw.ShowInTaskbar = false;
cw.ShowDialog() ;
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>
Activate() メソッドを使用します。これは、ウィンドウを前面に移動してアクティブにしようとします。例 Window wnd = new xyz(); wnd.Activate();
ポップアップ ウィンドウで、メソッド 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)
私はあなたと非常によく似た状況に遭遇しました。私が遭遇した検索のほとんどは、私がする必要があるのは、メインウィンドウまたは 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)
最善の方法は、この 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;
}
- そして確かに、あなたがトップにしたかったすべてのウィンドウは、あなたのアプリの他のウィンドウからアクセスできるはずです. 私の場合、ベース ウィンドウと、ベース ウィンドウの上部に配置する必要がある別のウィンドウがあるため、これはベース ウィンドウに別のウィンドウのインスタンスがあることには問題ありませんでした。
私はOPです。いくつかの調査とテストの後、答えは次のとおりです。
いいえ、正確にそれを行う方法はありません。
いくつかのスレッドがあり、「最上位」タグさえあります。それを検索するか、良さそうなこの投稿に直接アクセスしてください。
これを行う方法は次のとおりです。「最上位」ウィンドウを他のウィンドウの GotFocus および LostFocus イベントにサブスクライブさせ、イベント ハンドラーとして次を使用します。
class TopMostWindow
{
void OtherWindow_LostFocus(object sender, EventArgs e)
{
this.Topmost = false;
}
void OtherWindow_GotFocus(object sender, EventArgs e)
{
this.Topmost = true;
}
}
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
これをWindowsタグに追加できます
WindowStartupLocation="CenterScreen"
次に、続行するためにユーザーに確認してもらいたい場合は、それを表示することもできます
YourWindow.ShowDialog();
最初に TopMost パラメーターなしで試して、結果を確認します。
私も同じ問題に直面し、Google に従ってこの質問に回答しました。最近、次のことがうまくいくことがわかりました。
CustomWindow cw = new CustomWindow();
cw.Owner = this;
cw.ShowDialog();
これが私を助けたものです:
Window selector = new Window ();
selector.Show();
selector.Activate();
selector.Topmost = true;