web-dev-qa-db-ja.com

WPFでウィンドウの境界線とタイトルバーをスタイルするにはどうすればよいですか?

Telerikの一連のコントロールを使用するWPFアプリケーションを開発しており、すべてが正常に機能します。残念ながら、最近、すべてのダイアログの基本クラスを置き換えて、標準のWPFウィンドウでRadWindowを変更する必要がありました(理由はこの説明とは無関係です)。そうすることで、すべての開発者のコ​​ンピューター(Aeroを有効にしたWindows 7)できれいに見えるアプリケーションができましたが、クライアントの環境(Windows Server 2008 R2のターミナルサービス)で使用するとwhenいものになりました。

TelerikのRadWindowは、ダイアログの動作を模倣する標準ユーザーコントロールであるため、スタイリングは問題になりませんでした。しかし、WPFのウィンドウでは、その「境界線」を変更するのに苦労しています。ここでいう「境界線」とは、アイコン付きのタイトルバーと3つの標準ボタン(最小化、最大化/復元、閉じる)、およびウィンドウの周囲のサイズ変更グリップの両方です。

これらのアイテムの外観を変更するにはどうすればよいですか:

  • タイトルバーの色
  • 3つの標準ボタン
  • ウィンドウの実際の境界線の色

可能であれば丸い角で。

32
Marcel Gosselin

これらは「非クライアント」領域であり、Windowsによって制御されます。 この件に関するMSDNドキュメントはこちら (関連情報は上部にあります)。

基本的に、WindowのWindowStyle = "None"を設定してから、独自のウィンドウインターフェイスを構築します。 ( SOに関する同様の質問

27
Muad'Dib

設定する必要があります

WindowStyle="None"AllowsTransparency="True"およびオプションでResizeMode="NoResize"
そして、ウィンドウのStyleプロパティをカスタムウィンドウスタイルに設定します。ここで、ウィンドウの外観(タイトルバー、ボタン、境界線)を任意に設計し、ウィンドウの内容を表示します。 ContentPresenterで。

This は、これを実現する方法に関する良い記事のようですが、インターネットには他にも多くの記事があります。

13
Lescai Ionel

この質問 の@DKコメントから、より簡単な解決策を見つけました。解決策はAlexによって書かれ、 ここで説明 ソース、カスタマイズされたウィンドウを作成するには:

  1. サンプルプロジェクトをダウンロード こちら
  2. generic.xamlファイルを編集して、レイアウトをカスタマイズします。
  3. 楽しい :)。
6
Anas

以下のサンプルを確認してください XAMLでウィンドウの外観をカスタマイズするWPF

このサンプルは、期待される機能をすべて提供しながら、非クライアント領域(タイトルバー、境界線、最大、最小、閉じるボタン)を含むウィンドウのスタイル/外観を完全にカスタマイズする方法を示します。

4
Abou-Emish

Windowsだけが非クライアント領域を制御できるため、できないと誰かが言った場合、彼らは間違っています!

Windowsでは非クライアント領域の寸法を指定できるため、これは半分の真実です。実際、これはWindowsのカーネルメソッド全体でのみ可能であり、C/C++ではなく.NETを使用しています。とにかく、心配しないでください! P/Invokeはそのようなことだけを目的としていました!実際、WindowsフォームUIおよびコンソールアプリケーションのStd-I/Oメソッドはすべて、システムコールを使用して提供されます。したがって、MSDNで文書化されているように、適切なシステムコールを実行するだけで、非クライアント領域を設定できます。

しかし、これはかなり前に思いついた非常に難しい解決策です。幸いなことに、.NET 4.5以降では、WindowChromeクラスを使用して、必要に応じて非クライアント領域を調整できます。 ここ 始めることができます。

物事をより簡単できれいにするために、私はあなたをリダイレクトします here 、あなたが望むものにウィンドウの境界寸法を変更するためのガイド。 0に設定すると、システムの境界線の代わりにカスタムウィンドウの境界線を実装できます。

明確な例を掲載していないことを申し訳ありませんが、後で確認します。

2
Davide Cannizzo

既存のソリューションから始めて、ニーズに合わせてカスタマイズすることをお勧めします。ゼロから始めるよりはましです。

私は同じものを探していましたが、私は this オープンソースソリューションに落ちました。それが役立つことを願っています。