大規模な C# アプリケーションを作成します。ポイントは、アプリケーションのユーザーがコントロールの色を調整できるようにすることです。System.Drawing.SystemColors をオーバーライドする (このアプリケーションのコンテキストでのみ) 解決策があれば、すべてのコントロールの値を手動で設定する必要がなくなります。私の問題の簡単な解決策を知っている人はいますか? ありがとう
6 に答える
最善のアプローチは、各コントロールを継承し、そのデフォルトの表示プロパティを設定することだと思います。これにより、簡単にカスタマイズして再利用できる標準のWinFormsコントロールのライブラリが提供されます。詳細については、こちらをご覧ください(VBでは、C#で例を見つけることができませんでした)。
アプリケーション設定バインディングを見てください。すべてのコントロールに対してこれを行う方法はわかりませんが、コントロール ツリーを単純に再帰するだけで十分です。
このようなことをするために、以下のコードを書きました。通常とは異なるコントロールには特別な処理が必要なので、特に満足していませんが、うまくいきました。Painter のインスタンスを保持し、フォームを作成するたびに Apply を呼び出し、フォームを引数として渡します。すべての子コントロールを再帰し、外観を変更します
public class Painter
{
Color foreColor;
Color backColor;
Color altBackColor;
Color buttonColor;
Font font;
public Painter(Color foreColor, Color backColor, Color altBackColor, Color buttonColor, Font font)
{
this.foreColor=foreColor;
this.backColor=backColor;
this.altBackColor=altBackColor;
this.buttonColor=buttonColor;
this.font=font;
}
public void Apply(Control c)
{
if(c==null)
return;
c.ForeColor = foreColor;
c.BackColor = (c is Button ) ? buttonColor
: backColor;
if (c is DataGridView)
{
var dgv = (DataGridView) c;
dgv.BackgroundColor = BackColor;
dgv.AlternatingRowsDefaultCellStyle.BackColor = altBackColor;
dgv.ColumnHeadersDefaultCellStyle.BackColor = buttonColor;
}
c.Font = font;
foreach(Control child in c.Controls)
Apply(child);
}
}
システムのデフォルトを上書きする必要はありませんが、独自の色を定義できます。
Color NastyColour = Color.FromArgb(1, 2, 3);
1 = 赤 2 = 緑 3 = 青
残念ながら、アプリケーション用に Windows の配色を変更することはできません。
Winforms を使用すると、フォーム上のすべてのコントロールの背景色などを変更できますが、多くの領域 (ボタンのベベルの色やウィンドウのタイトル バーなど) では、おそらく自分でコントロールをペイントする必要があります。
$1000 を使って、DevExpress のコピーを入手してください。彼らのフレームワークを使用して大規模なアプリケーションを作成していますが、スキニング機能は優れています。
これが最良の答えとは思えないことは承知していますが、アプリケーション全体のスキニング機能を探している場合は、サードパーティ ライブラリが適している可能性があります。