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 >