How about
<Window namedStyles="{ buttons: @button_styles.json, labels : {color:'#ff0000'}
}"/>
...
</Window>
Hmmm, all this makes me wonder why we don't use a pure-JSON format for UI
files???
Greg Brown wrote:
> Hi all,
>
> I have recently been giving some thought to how we might support a form of
> style propagation. This has come up a few times and is clearly a feature that
> developers would like the platform to provide.
>
> By design, Pivot does not currently support style inheritance. We decided up
> front that there is not enough commonality between component and container
> styles for such an inheritance mechanism to make sense. What does make sense,
> however, is the concept of "named styles". These are similar in concept to
> CSS classes - they would allow a caller to specify a set of styles by name
> that should be applied to a component. For example, all Labels associated
> with the "boldLabel" named style would be bold.
>
> Pivot currently supports a rudimentary form of named styles via the URL-based
> styles setter:
>
> <Label styles="@my_label_styles.json"/>
>
> There are a couple of downsides to this approach, though:
>
> - It requires designers to split their style definitions into many small
> files.
>
> - It only allows the designer to apply a single set of styles; style sets
> cannot be combined (e.g. "apply both my_styles1.json and my_styles2.json"),
> nor can they be overridden on a per-component basis by applying local styles
> (e.g. "apply my_styles.json and {foo:'bar'}").
>
> I have a proposed solution and I would like to hear your feedback on it. I
> suggest that we add a "namedStyles" property at the Container level. This
> property would be a read-only dictionary mapping style group names to maps of
> style properties:
>
> Container {
> NamedStyleDictionary : Dictionary<String, Map<String, ?>>
> }
>
> These styles could be referred to by child components of the container. For
> example, the following would create a "boldLabel" style at the Window level
> and apply it to the window's content:
>
> <Window namedStyles="{boldLabel:{font:{bold:true}}}">
> <Label styles="boldLabel"/>
> </Window>
>
> Named styles could be combined as well as augmented on a per-component basis
> by local styles:
>
> <Label styles="boldLabel, redLabel, {backgroundColor:'#00ff00'}"/>
>
> Additionally, nested container could override styles defined by an ancestor:
>
> <Window namedStyles="{myLabel:{color:'#ff0000'}}">
> <BoxPane namedStyles="{myLabel:{color:'#0000ff'}}">
> <!-- Label text will be blue -->
> <Label styles="myLabel"/>
> </BoxPane>
> </Window>
>
> Finally, named styles could be stored externally and loaded via URL or
> resource path:
>
> <Window namedStyles="@my_styles.json">
> ...
> </Window>
>
> <Window namedStyles="com/foo/my_styles.json">
> ...
> </Window>
>
> Overall, I think the approach works well. It addresses the major issues that
> have been raised and does so in a manner that is consistent with other
> aspects of BXML and WTK. There is only one aspect of the design that I am not
> 100% happy with - supporting a simple "namedStyles" attribute would only
> allow the developer to include a single named styles definition per
> container. In practice, this is probably sufficient, but it would be nice to
> support multiple style sheets if possible. My proposed solution to this is as
> follows:
>
> <Window>
> <namedStyles buttons="@button_styles.json"
> labels="{color:'#ff0000'}"/>
> ...
> </Window>
>
> This would be the equivalent of the following style sheet applied via the
> "namedStyles" attribute:
>
> { buttons: {
> // content of button_styles.json
> },
>
> labels: {
> color: "#ff0000"
> }
> }
>
> This syntax could be supported in addition to, or instead of, the attribute
> syntax.
>
> Please let me know what you think of this possible approach.
>
> Thanks,
> Greg
>