使用StyleBook时,如果按钮是Diasbled,则颜色几乎不会描述按钮被禁用。因此,我希望在禁用按钮时更改颜色。我怎么做。 我正在使用Delphi Seattle
答案 0 :(得分:2)
这不像改变样式簿中的正常颜色那样直截了当。禁用外观是通过降低控件的不透明度而不是通过调整任何颜色属性来实现的。
我要做的是首先使用您喜欢的颜色为禁用按钮创建样式。每当您禁用该按钮时,您可以将按钮的StyleLookup
设置为该样式的名称,如果再次启用它,则将其更改回默认值。
除此之外,您可能还想禁用调整不透明度的常用行为。因此,您需要设置按钮的DisabledOpacity
。您通常无法访问该属性,但可以通过继承它来打开它。
type
TMyButton = class (TButton);
// ...
TMyButton(Button1).DisabledOpacity := 1.0;
答案 1 :(得分:0)
聚会晚了一点,但是我遇到了同样的问题。我想出的解决方案是让我自己的后代成为TButton,就像@DNR一样,我将DisabledOpacity设置为1.0。但是,我没有为禁用按钮的版本提供完整的单独样式,而是实现了用于设置控件enabled属性的动画/效果触发器。这样就可以在按钮样式中使用彩色动画。
一些代码段:
界面
TMyButton = class(TButton)
protected
procedure ApplyStyle; override;
procedure ApplyTriggers; override;
procedure SetEnabled(const Value: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
end;
实施
{ TMyButton }
procedure TMyButton.ApplyStyle;
begin
inherited;
if not Enabled then
ApplyTriggers;
end;
procedure TMyButton.ApplyTriggers;
begin
StartTriggerAnimation(Self, 'Enabled');
ApplyTriggerEffect(Self, 'Enabled');
inherited;
end;
constructor TMyButton.Create(AOwner: TComponent);
begin
inherited;
DisabledOpacity := 1;
end;
procedure TMyButton.SetEnabled(const Value: Boolean);
var
LOldValue: Boolean;
begin
LOldValue := Enabled;
inherited;
if IsInflated and (LOldValue <> Value) then
ApplyTriggers;
end;
假设您有一个带有TRectangle背景的按钮,您可以按照以下样式进行操作:
object TLayout
StyleName = 'TMyButtonStyle'
Align = Center
Size.Width = 200.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object TRectangle
StyleName = 'background'
Align = Contents
Fill.Color = claWhite
HitTest = False
Size.Width = 200.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
object TColorAnimation
StyleName = 'caFillEnabled'
Duration = 0.200000002980232200
PropertyName = 'Fill.Color'
StartValue = claWhite
StopValue = claLightgray
Trigger = 'Enabled=false'
TriggerInverse = 'Enabled=true'
end
...