Visibility.Hidden と Visibility.Visible を介してタブ キーを押したままにした場合にのみ表示される WPF ウィンドウがあります。ただし、キーを押したままにすると、フォーカスがアクティブなアプリケーションから WPF ウィンドウに移動します。この動作を無効にすることはできますか? さらに進んで: コントロールがクリックされてもウィンドウがフォーカスされないようにすることは可能ですが、それでもコントロールのクリック アクションを登録しますか?
5 に答える
他の場所で答えを見つけました:
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
//Set the window style to noactivate.
var helper = new WindowInteropHelper(this);
SetWindowLong(helper.Handle, GWL_EXSTYLE,
GetWindowLong(helper.Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
}
private const int GWL_EXSTYLE = -20;
private const int WS_EX_NOACTIVATE = 0x08000000;
[DllImport("user32.dll")]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
.NET 3.5 SP1以降、WPFフォームにはShowActivatedプロパティがあります。これをに設定すると、この
false
ようにマークされたフォームはフォーカスを奪うことはなくなります。
特定の最上位ウィンドウが WPF でアクティブ化されないようにします。
ここに記載されている Win32 ソリューションを試しましたが、うまくいきませんでした。ウィンドウの「アクティブ化」を防止しているように見えFocus
ますが、アプリケーション内の別の適格なウィンドウに復元されることはなく、その後は宙に浮いたままになります。代わりに、次のことがうまくいきました:
まず、すべての非プライマリ ウィンドウのOwner
プロパティが main に設定されていることを確認しますWindow
。サブウィンドウのコンストラクターでこれを行います。この場合、メインWindow
が最初にロードされるようにするために、いくつかの手順 (ここでは説明しません) を実行する必要があります。
public MySubWindow()
{
if ((base.Owner = Application.Current.MainWindow) == null)
throw new Exception();
InitializeComponent();
}
プロパティを設定Owner
すると、サブ ウィンドウがメイン ウィンドウの上に表示されるようになります。サブ ウィンドウについては、示されているように次のプロパティを設定します (XAML またはコード)。
ShowActivated="False"
Focusable="False"
ShowInTaskbar="False"
IsEnabled="False"
FocusManager.IsFocusScope="False"
OnActivated
最後に、ブロックされたウィンドウにハンドラーを追加します。Activated
イベントを発生させるため、基本メソッドは呼び出しません。(ウィンドウが非表示になるため、アクティブ化を Visual Studio デザイナーから切り替えないでください)。
protected override void OnActivated(EventArgs e)
{
if (DesignerProperties.GetIsInDesignMode(this))
return;
base.Owner.Activate();
}
おそらく、ウィンドウの代わりに PopupWindow が必要ですか? falseに設定できるFocusableのプロパティがあります(デフォルトではfalseかもしれません)。