【解決方法】タスクバー アイコンが非表示のときにモーダル フォームにフォーカスする方法 C#

[ad_1]

やあ、
トップレベルのフォームにフォーカスしたいだけです。

Form.Showdialog() を使用して 2 番目のフォームに焦点を合わせました。
今私の問題は、2 番目のフォームのタスクバー アイコンが非表示になっていることです。

したがって、親フォームのタスクバー アイコンのみが表示されます。

最初のフォームのタスクバー アイコンをクリックすると、最初のフォームのみが表示され、2 番目のフォームは非表示になります。

ノート: トップレベルのフォームである 2 番目のフォームにフォーカスできません。 最初にフォームのタスクバー アイコンがクリックされたときにそれを表示する方法。

この問題を解決する方法。

解決策 1

まず第一に、この問題はフォームを表すタスクバー アイコンの可視性とは関係ありませんが、クリックするものが何もないという理由で質問されていることは理解しています。 プログラムでそれを行うことができますが、なぜですか?

これは複雑な問題なので、気を付けなければならないことをいくつか挙げておきます。 問題が明確に説明されていないため、自分で組み立てようとします。

  • フォームは「フォーカス」されていませんが、 アクティブ化:
    https://msdn.microsoft.com/en-us/library/system.windows.yforms.form.activate%28v=vs.80%29.aspx[^].
  • 別のアプリケーションに切り替えない限り、モーダル状態のフォームのアクティブ状態を失うべきではありません。 アプリケーションのフォームのアクティブ化を強制する理由はありません。 ユーザーはよく知っています。 ユーザーが別のアプリケーションに切り替える場合は、意図的に行ったと想定してください。
  • 他のアプリケーションへの切り替えに関して、すべてのアプリケーション フォームの Z オーダーを適切に維持する必要があります。 すべてのフォームは、デスクトップの Z オーダーにまとめられる必要があります。 すべてのフォーム間で所有者所有の関係を維持すれば、簡単に実現できます。 https://msdn.microsoft.com/en-us/library/system.windows.forms.form.owner%28v=vs.80%29.aspx[^] (他の関連メンバーも参照してください。ただし、これで十分です)。

    実際には、メイン フォームを他のすべてのフォームの所有者にし、メイン フォームを常に表示しておくだけで十分です (アプリケーションの他のフォームや他のアプリケーションでカバーできないという意味ではありません)。 次に、Z オーダーでどのフォームが一番上にあるかに関係なく、アプリケーションのいずれかのフォームをアクティブにすると、他のすべてのフォームが何らかの順序で一番上に移動するため、他のアプリケーションのウィンドウが間に忍び込むことはありません。

  • 前のテクニックを Form.ShowInTaskbar:
    https://msdn.microsoft.com/en-us/library/system.windows.forms.form.showintaskbar%28v=vs.80%29.aspx[^].

    上記に一致する基本設計は次のようになります。メイン フォームではこのプロパティを true にし、他のすべてのフォームでは false にします。 このように、ユーザーがタスクバーを使用してアプリケーションをアクティブ化するかどうかにかかわらず (タスクバーには常にアプリケーションごとに 1 つの項目のみが表示され、クリックするのは 1 つだけです)、アプリケーションがモーダル フォームを表示している場合は、フォームの一部がアクティブ化されます。この時点で、最上位のモーダル フォームがアクティブになります。 それはあなたの問題を解決するはずです。

    同時に、意図的に追加して、このスタイルから逸脱することもできます Form.ShowInTaskbar モーダル フォームなど、他の選択フォームの場合は true です。 私はこのスタイルが好きではありません。ユーザーが何をクリックするかを選択できるようになり、1 回のクリックでは意味がなくなるからです。 次のルールを維持することもできます。一度に 1 つのフォームだけが、このプロパティを true に等しくする必要があります。 しかし、私は気にしません。 タスク バーにメイン フォームのみを表示する最も単純なルールで十分です。

  • さらに良いことに、メイン フォームが 1 つだけのデザインを好みます。 他のフォームは、メイン フォーム内のいくつかのコントロールになる可能性があり、パネル (表示と非表示、オプションでサイズ変更) になる可能性があります。 TabPage インスタンス内のインスタンス TabControl、 等々。 よりモーダルな形式を意味しているわけではありません。 少数でも構いませんが、無理をしないでください。 このような設計は、ナビゲートして理解するのが最も簡単です。 動的ドッキングを使用して、Visual Studio と同様の UI を開発することもできます。
  • 同時に、MDI は絶対に使用しないでください。 ただしないでください。

より具体的なアドバイスが必要な場合は、より詳細な情報を提供する必要があります。

幸運を。

-SA

[ad_2]

コメント

タイトルとURLをコピーしました