Exemple #1
0
        public async void Track_By_Name_Should_Find_Control_Added_Earlier()
        {
            TextBlock target;
            TextBlock relativeTo;

            var root = new TestRoot
            {
                Child = new StackPanel
                {
                    Children = new Controls.Controls
                    {
                        (target = new TextBlock {
                            Name = "target"
                        }),
                        (relativeTo = new TextBlock {
                            Name = "start"
                        }),
                    }
                }
            };

            var locator = ControlLocator.Track(relativeTo, "target");
            var result  = await locator.Take(1);

            Assert.Same(target, result);
            Assert.Equal(0, root.NameScopeRegisteredSubscribers);
            Assert.Equal(0, root.NameScopeUnregisteredSubscribers);
        }
Exemple #2
0
        private ExpressionObserver CreateFindAncestorObserver(
            IStyledElement target,
            RelativeSource relativeSource,
            string path,
            bool enableDataValidation)
        {
            Contract.Requires <ArgumentNullException>(target != null);

            IObservable <object> controlLocator;

            switch (relativeSource.Tree)
            {
            case TreeType.Logical:
                controlLocator = ControlLocator.Track(
                    (ILogical)target,
                    relativeSource.AncestorLevel - 1,
                    relativeSource.AncestorType);
                break;

            case TreeType.Visual:
                controlLocator = VisualLocator.Track(
                    (IVisual)target,
                    relativeSource.AncestorLevel - 1,
                    relativeSource.AncestorType);
                break;

            default:
                throw new InvalidOperationException("Invalid tree to traverse.");
            }

            return(new ExpressionObserver(
                       controlLocator,
                       path,
                       enableDataValidation));
        }
Exemple #3
0
        public void Track_By_Name_Should_Find_Control_Added_Later()
        {
            StackPanel panel;
            TextBlock  relativeTo;

            var root = new TestRoot
            {
                Child = (panel = new StackPanel
                {
                    Children = new Controls.Controls
                    {
                        (relativeTo = new TextBlock
                        {
                            Name = "start"
                        }),
                    }
                })
            };

            var locator = ControlLocator.Track(relativeTo, "target");
            var target  = new TextBlock {
                Name = "target"
            };
            var result = new List <IControl>();

            using (locator.Subscribe(x => result.Add(x)))
            {
                panel.Children.Add(target);
            }

            Assert.Equal(new[] { null, target }, result);
            Assert.Equal(0, root.NameScopeRegisteredSubscribers);
            Assert.Equal(0, root.NameScopeUnregisteredSubscribers);
        }
        protected ExpressionObserver CreateFindAncestorObserver(
            IStyledElement target,
            RelativeSource relativeSource,
            ExpressionNode node)
        {
            _ = target ?? throw new ArgumentNullException(nameof(target));

            IObservable <object?> controlLocator;

            switch (relativeSource.Tree)
            {
            case TreeType.Logical:
                controlLocator = ControlLocator.Track(
                    (ILogical)target,
                    relativeSource.AncestorLevel - 1,
                    relativeSource.AncestorType);
                break;

            case TreeType.Visual:
                controlLocator = VisualLocator.Track(
                    (IVisual)target,
                    relativeSource.AncestorLevel - 1,
                    relativeSource.AncestorType);
                break;

            default:
                throw new InvalidOperationException("Invalid tree to traverse.");
            }

            return(new ExpressionObserver(
                       controlLocator,
                       node,
                       null));
        }
Exemple #5
0
        private ExpressionObserver CreateElementObserver(IControl target, string elementName, string path)
        {
            Contract.Requires <ArgumentNullException>(target != null);

            var result = new ExpressionObserver(
                ControlLocator.Track(target, elementName),
                path);

            return(result);
        }
Exemple #6
0
        private ExpressionObserver CreateFindAncestorObserver(
            IControl target,
            string path)
        {
            Contract.Requires <ArgumentNullException>(target != null);

            return(new ExpressionObserver(
                       ControlLocator.Track(target, RelativeSource.AncestorType, RelativeSource.AncestorLevel - 1),
                       path));
        }
Exemple #7
0
 protected override void StartListeningCore(WeakReference reference)
 {
     if (reference.Target is ILogical logical)
     {
         _subscription = ControlLocator.Track(logical, _name).Subscribe(ValueChanged);
     }
     else
     {
         _subscription = null;
     }
 }
Exemple #8
0
        public void Track_By_Name_Should_Find_Control_When_Tree_Changed()
        {
            TextBlock target1;
            TextBlock target2;
            TextBlock relativeTo;

            var root1 = new TestRoot
            {
                Child = new StackPanel
                {
                    Children = new Controls.Controls
                    {
                        (relativeTo = new TextBlock
                        {
                            Name = "start"
                        }),
                        (target1 = new TextBlock {
                            Name = "target"
                        }),
                    }
                }
            };

            var root2 = new TestRoot
            {
                Child = new StackPanel
                {
                    Children = new Controls.Controls
                    {
                        (target2 = new TextBlock {
                            Name = "target"
                        }),
                    }
                }
            };

            var locator = ControlLocator.Track(relativeTo, "target");
            var target  = new TextBlock {
                Name = "target"
            };
            var result = new List <IControl>();

            using (locator.Subscribe(x => result.Add(x)))
            {
                ((StackPanel)root1.Child).Children.Remove(relativeTo);
                ((StackPanel)root2.Child).Children.Add(relativeTo);
            }

            Assert.Equal(new[] { target1, null, target2 }, result);
            Assert.Equal(0, root1.NameScopeRegisteredSubscribers);
            Assert.Equal(0, root1.NameScopeUnregisteredSubscribers);
        }
Exemple #9
0
        private ExpressionObserver CreateFindAncestorObserver(
            IControl target,
            RelativeSource relativeSource,
            string path,
            bool enableDataValidation)
        {
            Contract.Requires <ArgumentNullException>(target != null);

            return(new ExpressionObserver(
                       ControlLocator.Track(target, relativeSource.Tree, relativeSource.AncestorLevel - 1, relativeSource.AncestorType),
                       path,
                       enableDataValidation));
        }
Exemple #10
0
        private ExpressionObserver CreateElementObserver(
            IStyledElement target,
            string elementName,
            ExpressionNode node)
        {
            Contract.Requires <ArgumentNullException>(target != null);

            var result = new ExpressionObserver(
                ControlLocator.Track(target, elementName),
                node,
                null);

            return(result);
        }
Exemple #11
0
        private ExpressionObserver CreateElementObserver(
            IStyledElement target,
            string elementName,
            string path,
            bool enableDataValidation)
        {
            Contract.Requires <ArgumentNullException>(target != null);

            var description = $"#{elementName}.{path}";
            var result      = new ExpressionObserver(
                ControlLocator.Track(target, elementName),
                path,
                enableDataValidation,
                description);

            return(result);
        }
Exemple #12
0
        public void Track_By_Name_Should_Track_Removal_And_Readd()
        {
            StackPanel panel;
            TextBlock  target;
            TextBlock  relativeTo;

            var root = new TestRoot
            {
                Child = panel = new StackPanel
                {
                    Children = new Controls.Controls
                    {
                        (target = new TextBlock {
                            Name = "target"
                        }),
                        (relativeTo = new TextBlock {
                            Name = "start"
                        }),
                    }
                }
            };

            var locator = ControlLocator.Track(relativeTo, "target");
            var result  = new List <IControl>();

            locator.Subscribe(x => result.Add(x));

            var other = new TextBlock {
                Name = "target"
            };

            panel.Children.Remove(target);
            panel.Children.Add(other);

            Assert.Equal(new[] { target, null, other }, result);
        }
Exemple #13
0
 protected override void Subscribed()
 {
     _ownerSubscription = ControlLocator.Track(_item, 0, typeof(TabControl)).Subscribe(OwnerChanged);
 }
Exemple #14
0
 protected override void StartListeningCore(WeakReference <object> reference)
 {
     if (reference.TryGetTarget(out object target) && target is ILogical logical)
     {
         _subscription = ControlLocator.Track(logical, _level, _ancestorType).Subscribe(ValueChanged);
     }