FireMonkey自定义控件的Style的一个注意的地方
当我们自定义控件的时候,如果是直接从TStyledControl或TPresentedControl继承的时候,当设置控件Style时,一定要注意控件Style的Root容器(一般是TLayout)的Align属性的设置。因为在设计时,默认Align属性是Center,然后通过资源文件加载Style,但是这样有一个问题,当我们创建完控件,重新设置控件大小的时候,这时候控件的大小变了,但是控件的Style不会改变,因为Style的Align= Center,所以改变控件的大小会出问题。但是在设计的时候又不能设置为Client或Contents,这样会满屏,很不方便。所以只能是保存为Style后,在记事本文件中打开Style文件,把Style的Root对象的Align手动改为Client或Contents。
为这个问题也纠结了一天了,因为如果从StdControl继承的控件,没这问题。如果从TStyledControl或TPresentedControl继承,但是不重写GetStyleObject方法,采用默认Style名称的话,也没这问题。但是当采用自定义Style,通过GetStyleObject从资源文件获取Style的时候,就会有这个问题。
function TMyPanel.GetStyleObject: TFmxObject; begin Result := nil; if StyleLookup.IsEmpty then begin Result := TStyleStreaming.LoadFromResource(HInstance, 'MyPanelStyle', rt_rcdata); Exit end; if Result = nil then Result := inherited GetStyleObject; end;
但是,为什么会有这个问题啊,因为在ApplyStyleLookup里面已经有代码设置Style对象的Align = Contents
procedure TStyledControl.ApplyStyleLookup; procedure InternalApplyStyle(const StyleObject: TFmxObject); var StyleControl: TControl; begin FStyleState := TStyleState.Applying; try if StyleObject is TControl then begin StyleControl := TControl(StyleObject); FAdjustSizeValue := TPointF.Create(StyleControl.Width, StyleControl.Height); StyleControl.Visible := True; StyleControl.FAlign := TAlignLayout.None; StyleControl.FAnchors := AnchorAlign[TAlignLayout.None]; try StyleControl.BoundsRect := StyleControl.Margins.PaddingRect(LocalRect); finally StyleControl.FAlign := TAlignLayout.Contents; //这里,设置了Style控件的对齐,对于自定义控件的Style不起作用?????? StyleControl.FAnchors := AnchorAlign[TAlignLayout.Contents]; end; FResourceLink := StyleObject; StyleControl.SetAcceptsControls(False); InsertObject(0, StyleControl); { } StyleControl.Stored := False; StyleControl.Lock; ApplyStyle; FUpdateEffects := True; DoApplyStyleLookup; end else begin FResourceLink := StyleObject; InsertObject(0, StyleObject); { } StyleObject.Stored := False; ApplyStyle; DoApplyStyleLookup; end; FStyleState := TStyleState.Applied; except FStyleState := TStyleState.Error; raise; end; end; var StyleObject: TFmxObject; SaveDisableAlign: Boolean; begin if FIsNeedStyleLookup and (Scene <> nil) and not InPaintTo then begin FIsNeedStyleLookup := False; if not (csDesigning in ComponentState) and (Scene.StyleBook = nil) then begin if not FStyleLookup.IsEmpty then StyleObject := TStyleCache.Current.FindResource(FStyleLookup) else StyleObject := TStyleCache.Current.FindResource(GetDefaultStyleLookupName); end else StyleObject := nil; if StyleObject = nil then StyleObject := GetStyleObject; if StyleObject <> nil then begin SaveDisableAlign := FDisableAlign; try FDisableAlign := True; InternalApplyStyle(StyleObject); finally FDisableAlign := SaveDisableAlign; Realign; end; end; end; end;
跟踪也发现自定义Style也设置了这个,为什么不起作用呢??????