简体   繁体   English

如何正确使用GWT中导入的CSS样式

[英]How to use imported css styles in GWT correctly

Imagine you created the following simple widget with UiBinder: 想象一下,您使用UiBinder创建了以下简单小部件:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">

    <ui:style type="my.package.Widget1.Widget1Style">
        .childWidgetStyle {
            border-width: 1px;
            border-style: dotted;
        }
    </ui:style>

    <g:TextArea styleName="{style.childWidgetStyle}"/>
</ui:UiBinder>

package my.package;
// some imports here

public class Widget1 extends Composite {
    private static Widget1UiBinder uiBinder = GWT.create(Widget1UiBinder.class);

    interface Widget1UiBinder extends UiBinder<Widget, Widget1> {
    }

    public interface Widget1Style extends CssResource {
        String childWidgetStyle();
    }

    @UiField
    TextArea textArea;

    public Widget1(String text) {
        initWidget(uiBinder.createAndBindUi(this));
        textArea.setText(text);
    }
}

Than you use this simple widget in another (parent) widget you created: 在您创建的另一个(父)窗口小部件中使用此简单窗口小部件:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">

    <ui:style>
        .parentWidgetStyle .childWidgetStyle {
            margin-bottom: 10px;
        }
    </ui:style>
    <g:VerticalPanel ui:field="listPanel" addStyleNames="{style.parentWidgetStyle}" />
</ui:UiBinder>

package my.package;
// imports go here
public class ParentWidget extends Composite {
    private static ParentWidgetUiBinder uiBinder = GWT.create(ParentWidgetUiBinder.class);

    interface ParentWidgetUiBinder extends UiBinder<Widget, ParentWidget> {
    }

    @UiField
    VerticalPanel listPanel;

    public ParentWidget(final String... texts) {
        initWidget(uiBinder.createAndBindUi(this));
        for (final String text : texts) {
            final Widget1 entry = new Widget1(text);
            listPanel.add(entry);
        }
    }
}

What you want to achieve is to get some margin between the Widget1 entries in the list using css. 你想要实现的是使用css在列表中的Widget1条目之间获得一些余量。 But this won't work. 但这不起作用。 Because GWT will obfuscate the css names. 因为GWT会混淆css名称。 And the obfuscated name for .childWidgetStyle in ParentWidget will be different from the .childWidgetStyle in Widget1 . ParentWidget .childWidgetStyle的混淆名称将与.childWidgetStyle中的Widget1 The resulting css will look similar to this: 生成的css看起来与此类似:

.G1unc9fbE {
    border-style:dotted;
    border-width:1px;
}
.G1unc9fbBB .G1unc9fDa {
    margin-bottom:10px;
}

So the margin setting wont apply. 因此保证金设定不适用。 How do I do this correctly? 我该怎么做呢?

The trick is to import the css class name into ParentWidget : 诀窍是将css类名导入ParentWidget

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">

    <ui:style import="my.widget.Widget1.Widget1Style">
        .parentWidgetStyle .Widget1Style-childWidgetStyle {
            margin-bottom: 10px;
        }
    </ui:style>
    <g:VerticalPanel addStyleNames="{style.parentWidgetStyle}" />
</ui:UiBinder>

The important part is, if you don't use ImportedWithPrefix annotation GWT will prefix the imported style names with the class name of the resource the css class is in. So childWidgetStyle becomes .Widget1Style-childWidgetStyle . 重要的是,如果你不使用ImportedWithPrefix注释,GWT会在导入的样式名前加上css类所在资源的类名。所以childWidgetStyle变成.Widget1Style-childWidgetStyle

(edit: removed part about @Shared following comments and documentation .) (编辑:删除部分关于@Shared的评论和文档 。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM