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也设置了这个,为什么不起作用呢??????

posted @ 2019-07-26 22:16  舞天涯  阅读(276)  评论(0编辑  收藏  举报