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

转载于:https://www.cnblogs.com/jankerxp/p/11253224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值