【问题标题】:How to share stylesheet types across GWT widgets如何在 GWT 小部件之间共享样式表类型
【发布时间】:2010-02-20 16:11:30
【问题描述】:

我正在尝试创建一个复合小部件,它将显示子小部件的“列表”,但我在让 css 在此设置中工作时遇到了一些麻烦。构建了一个简单的演示,尝试找出解决方案。已尝试像这样指定父小部件

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
   xmlns:g='urn:import:com.google.gwt.user.client.ui'>

 <ui:with field='res' type='egov.widgets.discussion.client.poc.Resources' />

 <g:FlowPanel ui:field="childPanel" stylePrimaryName='{res.style.parentStyle}'>

 </g:FlowPanel>

</ui:UiBinder>

有代码

public class CssParent extends Composite{

interface MyUiBinder extends UiBinder<Widget, CssParent> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

@UiField FlowPanel childPanel;

   public CssParent() {
      initWidget(uiBinder.createAndBindUi(this));

       CssChild child = new CssChild();
      childPanel.add(child);
   }  
}

子部件被简单地指定为

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
   xmlns:g='urn:import:com.google.gwt.user.client.ui'>

 <ui:with field='res' type='egov.widgets.discussion.client.poc.Resources' />

    <g:HTMLPanel stylePrimaryName='{res.style.childStyle}'>
       Howdy folks
    </g:HTMLPanel>

  </ui:UiBinder>

现在,您可以看到它们都引用了一个资源包:

public interface Resources extends ClientBundle {

@Source("CssDemo.css")
Style style();

  public interface Style extends CssResource{
     String parentStyle();
     String childStyle();
  }
}

再次引用 CssDemo.css: .parentStyle{ 背景颜色:灰色; }

.parentStyle .childStyle{
    background-color: yellow;
}

但由于某种原因,这些 css 规则从未应用于上面的两个 div 元素。关于为什么失败的任何想法?或者当样式包含不同 css 类之间的依赖规则时,在小部件之间共享 .css 样式表的更好方法?

【问题讨论】:

    标签: gwt stylesheet widget share


    【解决方案1】:

    发现需要注入这种方式使用的样式

     static{
         Resources.INSTANCE.style().ensureInjected();
     }
    

    (将这个单例实例字段添加到包中)

    public interface Resources extends ClientBundle {
    
        public static final Resources INSTANCE =  GWT.create(Resources.class);
    
        @Source("Resources.css")
        Style style();
    

    它现在可以工作了,但我真的不喜欢这样做 ("{res.style.someClass}") + 我必须在 CssResource 接口中定义的所有方法。

    如果可以做一个共享的 ui:style 声明(可能基于 css 文件),并且像普通的内部样式块一样使用它,那就太好了。

    【讨论】:

    • 我认为您误解了 CSS + UiBinder 的一个核心概念 - 您在本地(在 UiBinder XML 模板中)定义的 CSS 样式是 local - 意思是,您的 CssParentCssChild 小部件可以有一个具有相同名称的样式(具有不同的规则或不具有不同的规则) - 没有全局 CSS 命名空间,所有样式名称都将被混淆,这样它们就不会发生冲突。因此,在大多数情况下,您实际上不必编写像 .parentStyle .childStyle 这样的选择器 - 因为您仅在“本地”应用该样式。我只将全局 CSS 文件用于真正的全局样式,例如 TextBoxes 中的错误等。
    • 好点。在这种情况下,css 和 base-html 来自设计器。我想我必须让他们采用这种方法。 :)
    【解决方案2】:

    对我来说,有什么问题并不明显 - 您的代码至少接近正确(我一直在使用 styleName=&lt;whatever&gt; 而不是 stylePrimaryName=&lt;whatever&gt;,所以这是您可能会研究的一件事)。

    调试此类问题的方法是使用 Firebug 查看 (1) 哪些类名已应用于 DOM 元素,以及 (2) 哪些 CSS 规则基于这些样式生效。

    如果您将 @external parentStyle, childStyle; 放在 CSS 文件的开头,则 GWT 不会混淆样式名称,您将能够在 Firebug 中分辨出应用了哪些名称。

    更多建议:

    1. 使用DevMode 并在加载页面时查看它是否显示任何错误(它们将以红色文本显示) - 滚动到 DevMode 窗口顶部窗格的底部。
    2. 您可以使用一个更简单的示例来尝试此操作,使用单个复合类而不是两个。

    【讨论】:

    • 感谢@external 提示。在调试所有这些混淆名称的情况时确实遇到了麻烦。在这里发布了我的解决方案。您知道我要归档的内容是否有更优雅的方式?
    • 啊,是的,我忘记了您在回答中描述的 ensureInjected。这是让共享样式表工作的正确方法;如果您不这样做,我相信症状是应用了 CSS 类,但没有与它们关联的规则。 Igor Kilmer 在下面的评论是正确的 - 只有当样式跨越多个 UiBinder 小部件时才使用共享样式表。例如,我使用它们在相关但不同的 UI 元素中获得相似的外观。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2010-09-20
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多