かなりの数のFlatStyleボタンを備えたWindowsフォームプロジェクトがあります。
ボタンを無効にすると、ボタンの色が自動的に変更されます。 :(
どういうわけかこれをオーバーライドして、自分で色を制御できるようにすることは可能ですか?
EnabledChangedイベントを使用して、目的の色を設定する必要があります。これが例です。
private void Button1_EnabledChanged(object sender, System.EventArgs e)
{
Button1.ForeColor = sender.enabled == false ? Color.Blue : Color.Red;
Button1.BackColor = Color.AliceBlue;
}
要件に応じて希望の色を使用してください。
また、Paintイベントを使用する必要があります。
private void Button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
dynamic btn = (Button)sender;
dynamic drawBrush = new SolidBrush(btn.ForeColor);
dynamic sf = new StringFormat {
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center };
Button1.Text = string.Empty;
e.Graphics.DrawString("Button1", btn.Font, drawBrush, e.ClipRectangle, sf);
drawBrush.Dispose();
sf.Dispose();
}
あいまいさの少ないテキストを取得するには、代わりにTextRendererクラスを使用します。
private void Button1_Paint(object sender, PaintEventArgs e)
{
Button btn = (Button)sender;
// make sure Text is not also written on button
btn.Text = string.Empty;
// set flags to center text on button
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak; // center the text
// render the text onto the button
TextRenderer.DrawText(e.Graphics, "Hello", btn.Font, e.ClipRectangle, btn.ForeColor, flags);
}
そして、Harshの答えのようにButton1_EnabledChangedメソッド。
私は次のアプローチに従いました:-ボタンのClick()イベントは、カスタム変数を使用して制御できます。
private bool btnDisabled;
private void btnClick(object sender, EventArgs e){
if(!btnDisabled) return;}
このように、ボタンを無効にする必要はありません。ボタンにはまだクリック感がありますが、アクションは実行されません。ボタンが無効になっていることを伝えるには、適切な色を使用する必要があります。
ボタンが部分的に再描画されたときにクリップ効果を回避するために、e.ClipRectangleの代わりにClientRectangleを使用します。
e.Graphics.Clear(BackColor);
using (var drawBrush = new SolidBrush(ForeColor))
using (var sf = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
})
{
e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
}