示例#1
0
        private static bool findPropagationPathUsingTest(
            Control root, PropagationTest propagationTest, List <Control> path)
        {
            var outcome = propagationTest(root);

            switch (outcome)
            {
            case PropagationTestOutcome.Miss:
                return(false);

            case PropagationTestOutcome.PassThrough:
                if (!(root is IControlParent passThroughRootAsParent))
                {
                    return(false);
                }
                path.Add(root);
                if (tryFindPropagationPathForAnyChild(passThroughRootAsParent, propagationTest, path))
                {
                    return(true);
                }
                path.RemoveAt(path.Count - 1);
                return(false);

            case PropagationTestOutcome.Hit:
                path.Add(root);
                if (!(root is IControlParent hitRootAsParent))
                {
                    return(true);
                }
                tryFindPropagationPathForAnyChild(hitRootAsParent, propagationTest, path);
                return(true);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
示例#2
0
        private static List <Control> findPropagationPathUsingTest(IControlParent root, PropagationTest propagationTest)
        {
            var path = new List <Control>();

            tryFindPropagationPathForAnyChild(root, propagationTest, path);
            return(path);
        }
示例#3
0
 private static bool tryFindPropagationPathForAnyChild(
     IControlParent parent, PropagationTest propagationTest, List <Control> path) =>
 parent.Children.Reverse()
 .Any(child => findPropagationPathUsingTest(child, propagationTest, path));
示例#4
0
 // Never returns the root as part of the path.
 public static EventPropagationPath FindPropagationPath(IControlParent root, PropagationTest propagationTest) =>
 new EventPropagationPath(findPropagationPathUsingTest(root, propagationTest).AsReadOnly());