/// <summary> /// Constructor. /// </summary> public Children(XAMLiteGridNew parent) { _parent = parent; }
/// <summary> /// Loads the content for the control. /// </summary> protected override void LoadContent() { base.LoadContent(); var ch = Child as XAMLiteTextBlockNew; var bt = 0; if (ch != null) { bt = ch.StrokeThickness; } switch (Orientation) { case Orientation.Vertical: Width = 21; Height = Child != null && Height == 0 ? Child.Height - (bt * 2) : 100; break; case Orientation.Horizontal: Width = Child != null && Width == 0 ? Child.Width - (bt * 2) : 100; Height = 21; break; } // If there is a child linked to the Scroll Bar, set up a grid that imitates the // child's location so that the scroll bar will be positioned within its child's // boundaries. Also, modify the padding of the child to accommodate the space // that the scroll bar needs. if (ch != null) { DrawOrder = Child.DrawOrder + 1; var m = Child.Margin; _grid = new XAMLiteGridNew(Game) { Width = Child.Width, Height = Child.Height, Margin = new Thickness(m.Left, m.Top, m.Right + bt, m.Bottom), HorizontalAlignment = Child.HorizontalAlignment, VerticalAlignment = Child.VerticalAlignment, }; Game.Components.Add(_grid); _grid.Children.Add(this); ModifyChildPadding(ch); } var backDrop = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollBackDrop", Height = Height - (bt * 2), Width = Width, DrawOrder = DrawOrder }; Children.Add(backDrop); var t = Game.Content.Load <Texture2D>("Icons/ArrowButton"); var upArrowNormalButton = new XAMLiteImageNew(Game, t) { RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, DrawOrder = DrawOrder }; var downArrowNormalButton = new XAMLiteImageNew(Game) { SourceName = "Icons/ArrowButton", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.FlipVertical : RenderTransform.RotateClockwise90, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, DrawOrder = DrawOrder }; var c = Child as XAMLiteTextBlockNew; if (c == null) { return; } c.MouseDown += ChildOnMouseDown; // if the text height is less than the height of the block, do not load // scroll bar nor set the event handlers. if (Child is XAMLiteRichTextBlock) { var rtb = Child as XAMLiteRichTextBlock; _childTextHeight = rtb.MeasureTextHeight(); } else { _childTextHeight = c.MeasureText().Y; } if (_childTextHeight <= Child.Height) { Children.Add(upArrowNormalButton); Children.Add(downArrowNormalButton); return; } _upArrow = new XAMLiteGridNew(Game) { HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Width = t.Width, Height = t.Height, DrawOrder = DrawOrder }; Children.Add(_upArrow); _upArrow.Children.Add(upArrowNormalButton); var upArrowHoverButton = new XAMLiteImageNew(Game) { SourceName = "Icons/ArrowButtonHover", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _upArrow.Children.Add(upArrowHoverButton); _upArrowButtonMouseDown = new XAMLiteImageNew(Game) { SourceName = "Icons/ArrowButtonMouseDown", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _upArrow.Children.Add(_upArrowButtonMouseDown); _downArrow = new XAMLiteGridNew(Game) { HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Width = t.Width, Height = t.Height, Margin = new Thickness(0, 0, 0, bt), DrawOrder = DrawOrder }; Children.Add(_downArrow); _downArrow.Children.Add(downArrowNormalButton); var downArrowHoverButton = new XAMLiteImageNew(Game) { SourceName = "Icons/ArrowButtonHover", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.FlipVertical : RenderTransform.RotateClockwise90, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _downArrow.Children.Add(downArrowHoverButton); _downArrowButtonMouseDown = new XAMLiteImageNew(Game) { SourceName = "Icons/ArrowButtonMouseDown", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.FlipVertical : RenderTransform.RotateClockwise90, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _downArrow.Children.Add(_downArrowButtonMouseDown); // load the event handlers for the arrow buttons. _upArrow.MouseEnter += UpArrowOnMouseEnter; _upArrow.MouseLeave += UpArrowOnMouseLeave; _upArrow.MouseDown += UpArrowOnMouseDown; _downArrow.MouseEnter += DownArrowOnMouseEnter; _downArrow.MouseLeave += DownArrowOnMouseLeave; _downArrow.MouseDown += DownArrowOnMouseDown; _scrollBarNormal = new List <XAMLiteImageNew>(); _scrollBarHover = new List <XAMLiteImageNew>(); _scrollBarMouseDown = new List <XAMLiteImageNew>(); // percent of the text height versus the child height. var childToTextRatio = Child.Height / _childTextHeight; // the difference between the text height and the height of its // container. var textHeightToChildHeightDifference = _childTextHeight - Child.Height; // the maximum scroll bar height _maxScrollBarHeight = Height - (t.Height * 2); // the minimum scroll bar height. _minScrollBarHeight = 10; var scrollHeight = 0; if (textHeightToChildHeightDifference + _minScrollBarHeight < _maxScrollBarHeight) { scrollHeight = (int)(_maxScrollBarHeight - textHeightToChildHeightDifference); } else { _isLargeTextBlock = true; var difference = textHeightToChildHeightDifference + _minScrollBarHeight + 1 - _maxScrollBarHeight; _scrollValueAdjuster = difference / textHeightToChildHeightDifference; scrollHeight = (int)_minScrollBarHeight; _textValueAdjuster = (_childTextHeight - Height) / (_maxScrollBarHeight - scrollHeight); } // TODO: this is not truly set up yet. Focus is currently on vertical scrolling. var scrollWidth = Orientation == Orientation.Vertical ? Width : (int)((Width - (t.Width * 2)) * childToTextRatio); SetInitialScrollValues(new Vector2(scrollWidth, scrollHeight)); _scrollBar = new XAMLiteGridNew(Game) { Width = scrollWidth, Height = scrollHeight, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = Orientation == Orientation.Vertical ? new Thickness(0, t.Height, 0, 0) : new Thickness(t.Width, 0, 0, 0), DrawOrder = DrawOrder }; Children.Add(_scrollBar); _scrollBar.MouseEnter += ScrollBarOnMouseEnter; _scrollBar.MouseLeave += ScrollBarOnMouseLeave; _scrollBar.MouseDown += ScrollBarOnMouseDown; var tTop = Game.Content.Load <Texture2D>("Icons/ScrollButtonTopNoHover"); var tBottom = Game.Content.Load <Texture2D>("Icons/ScrollButtonBottomNoHover"); var scrollBarTopNoHover = new XAMLiteImageNew(Game, tTop) { RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarTopNoHover); _scrollBarNormal.Add(scrollBarTopNoHover); var scrollBarTopHover = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonTopHover", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarTopHover); _scrollBarHover.Add(scrollBarTopHover); var scrollBarTopMouseDown = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonTopMouseDown", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarTopMouseDown); _scrollBarMouseDown.Add(scrollBarTopMouseDown); var scrollBarBodyNoHover = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonBodyNoHover", Width = Orientation == Orientation.Vertical ? _scrollBar.Width : _scrollBar.Width - tTop.Width - tBottom.Width, Height = Orientation == Orientation.Vertical ? _scrollBar.Height - tTop.Height - tBottom.Height : _scrollBar.Height, RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarBodyNoHover); _scrollBarNormal.Add(scrollBarBodyNoHover); var scrollBarBodyHover = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonBodyHover", Width = Orientation == Orientation.Vertical ? _scrollBar.Width : _scrollBar.Width - tTop.Width - tBottom.Width, Height = Orientation == Orientation.Vertical ? _scrollBar.Height - tTop.Height - tBottom.Height : _scrollBar.Height, RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarBodyHover); _scrollBarHover.Add(scrollBarBodyHover); var scrollBarBodyMouseDown = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonBodyMouseDown", Width = Orientation == Orientation.Vertical ? _scrollBar.Width : _scrollBar.Width - tTop.Width - tBottom.Width, Height = Orientation == Orientation.Vertical ? _scrollBar.Height - tTop.Height - tBottom.Height : _scrollBar.Height, RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateCounterClockwise90, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarBodyMouseDown); _scrollBarMouseDown.Add(scrollBarBodyMouseDown); var scrollBarBottomNoHover = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonBottomNoHover", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateClockwise90, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarBottomNoHover); _scrollBarNormal.Add(scrollBarBottomNoHover); var scrollBarBottomHover = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonBottomHover", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateClockwise90, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarBottomHover); _scrollBarHover.Add(scrollBarBottomHover); var scrollBarBottomMouseDown = new XAMLiteImageNew(Game) { SourceName = "Icons/ScrollButtonBottomMouseDown", RenderTransform = Orientation == Orientation.Vertical ? RenderTransform.Normal : RenderTransform.RotateClockwise90, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Visibility = Visibility.Hidden, DrawOrder = DrawOrder }; _scrollBar.Children.Add(scrollBarBottomMouseDown); _scrollBarMouseDown.Add(scrollBarBottomMouseDown); }