public static Selector Descendent(this Selector previous) { return(new Selector(previous, stopTraversal: true) { SelectorString = " ", GetObservable = control => { // TODO: This needs to traverse the logical tree, not the visual. IVisual c = (IVisual)control; List <IObservable <bool> > descendentMatches = new List <IObservable <bool> >(); while (c != null) { c = c.VisualParent; if (c is IStyleable) { descendentMatches.Add(previous.GetActivator((IStyleable)c)); } } return new StyleActivator( descendentMatches, ActivatorMode.Or); }, }); }
public static Selector Template(this Selector previous) { Contract.Requires <ArgumentNullException>(previous != null); return(new Selector(previous, stopTraversal: true) { GetObservable = control => { IStyleable templatedParent = control.TemplatedParent as IStyleable; return templatedParent != null? previous.GetActivator(templatedParent) : Observable.Return(true); }, InTemplate = true, SelectorString = " $ ", }); }