23

Visibility.Hidden と Visibility.Visible を介してタブ キーを押したままにした場合にのみ表示される WPF ウィンドウがあります。ただし、キーを押したままにすると、フォーカスがアクティブなアプリケーションから WPF ウィンドウに移動します。この動作を無効にすることはできますか? さらに進んで: コントロールがクリックされてもウィンドウがフォーカスされないようにすることは可能ですが、それでもコントロールのクリック アクションを登録しますか?

4

5 に答える 5

21

他の場所で答えを見つけました:

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);
于 2012-09-27T19:00:31.863 に答える
15

.NET 3.5 SP1以降、WPFフォームにはShowActivatedプロパティがあります。これをに設定すると、このfalseようにマークされたフォームはフォーカスを奪うことはなくなります。

于 2012-09-25T23:15:35.947 に答える
3

特定の最上位ウィンドウが 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();
}
于 2015-05-18T04:25:01.917 に答える
0

おそらく、ウィンドウの代わりに PopupWindow が必要ですか? falseに設定できるFocusableのプロパティがあります(デフォルトではfalseかもしれません)。

于 2012-09-26T00:13:18.393 に答える