private UserCard CreateUserCard(UserVo user, int level)
        {
            var userCard = new UserCard {User = user};

            double left = Math.Round(HorizontalCenter - (userCard.Width*_itemsLevels[level].Count/2));
            userCard.Top = VerticalGap*(level + 1) + userCard.Height*level;
            userCard.Left = left + userCard.Width*_itemsLevels[level].Proccesed +
                            HorizontalGap*(_itemsLevels[level].Proccesed + 1);

            userCard.SetValue(FrameworkElement.NameProperty, "UserCard" + _userCardNumber++);
            Canvas.SetZIndex(userCard, 2);
            userCard.MouseLeftButtonDown += _mouseLeftButtonDownHandler;
            _whitespace.Children.Add(userCard);

            _itemsLevels[level].Proccesed++;

            foreach (UserVo childUser in user.Users)
            {
                UserCard childUserCard = CreateUserCard(childUser, level + 1);

                var line = new ConnectionLine {ParentUserCard = userCard, ChildUserCard = childUserCard};
                Canvas.SetZIndex(line, 1);
                _whitespace.Children.Add(line);
            }

            return userCard;
        }
        public UsersTreeBuilder(UserVo rootUser, Panel whitespace,
            MouseButtonEventHandler mouseLeftButtonDownHandler)
        {
            _whitespace = whitespace;
            _mouseLeftButtonDownHandler = mouseLeftButtonDownHandler;

            _itemsLevels = new Dictionary<int, TreeBuilderLevelData>
                           	{
                           		{0, new TreeBuilderLevelData {Count = 1}}
                           	};

            LoadItemsLevels(rootUser, 1);
            CreateUserCard(rootUser, 0);
        }
        private void LoadItemsLevels(UserVo user, int level)
        {
            if (user.Users.Count != 0)
            {
                if (!_itemsLevels.ContainsKey(level))
                {
                    _itemsLevels.Add(level, new TreeBuilderLevelData {Count = 0});
                }

                _itemsLevels[level].Count += user.Users.Count;

                foreach (UserVo childUser in user.Users)
                {
                    LoadItemsLevels(childUser, level + 1);
                }
            }
        }