예제 #1
0
        private PositioningData GetPositioningData(IEnumerable <DependencyObject> visualAncestry, Size popupSize, Size targetSize, Point offset)
        {
            var locationFromScreen = PlacementTarget.PointToScreen(new Point(0, 0));

            var mainVisual = visualAncestry.OfType <Visual>().LastOrDefault();

            if (mainVisual == null)
            {
                throw new ArgumentException($"{nameof(visualAncestry)} must contains unless one {nameof(Visual)} control inside.");
            }

            var screen       = Screen.FromPoint(locationFromScreen);
            var screenWidth  = (int)DpiHelper.TransformToDeviceX(mainVisual, (int)screen.Bounds.Width);
            var screenHeight = (int)DpiHelper.TransformToDeviceY(mainVisual, (int)screen.Bounds.Height);

            //Adjust the location to be in terms of the current screen
            var locationX = (int)(locationFromScreen.X - screen.Bounds.X) % screenWidth;
            var locationY = (int)(locationFromScreen.Y - screen.Bounds.Y) % screenHeight;

            var upVerticalOffsetIndepent = DpiHelper.TransformToDeviceY(mainVisual, UpVerticalOffset);
            var newUpY   = upVerticalOffsetIndepent - popupSize.Height + targetSize.Height;
            var newDownY = DpiHelper.TransformToDeviceY(mainVisual, DownVerticalOffset);

            double    offsetX;
            const int rtlHorizontalOffset = 20;

            if (FlowDirection == FlowDirection.LeftToRight)
            {
                offsetX = DpiHelper.TransformToDeviceX(mainVisual, offset.X);
            }
            else
            {
                offsetX = DpiHelper.TransformToDeviceX(mainVisual,
                                                       offset.X - targetSize.Width - rtlHorizontalOffset);
            }

            return(new PositioningData(
                       mainVisual, offsetX,
                       newUpY, newDownY,
                       popupSize, targetSize,
                       locationX, locationY,
                       screenHeight, screenWidth));
        }
        private PositioningData GetPositioningData(IEnumerable <DependencyObject> visualAncestry, Size popupSize, Size targetSize, Point offset)
        {
            var locationFromScreen = PlacementTarget.PointToScreen(new Point(0, 0));

            var mainVisual = visualAncestry.OfType <Visual>().LastOrDefault();

            if (mainVisual == null)
            {
                throw new ArgumentException($"{nameof(visualAncestry)} must contains unless one {nameof(Visual)} control inside.");
            }

            var screenWidth  = (int)DpiHelper.TransformToDeviceX(mainVisual, SystemParameters.PrimaryScreenWidth);
            var screenHeight = (int)DpiHelper.TransformToDeviceY(mainVisual, SystemParameters.PrimaryScreenHeight);

            var locationX = (int)locationFromScreen.X % screenWidth;
            var locationY = (int)locationFromScreen.Y % screenHeight;

            double    offsetX;
            const int rtlHorizontalOffset = 20;

            if (FlowDirection == FlowDirection.LeftToRight)
            {
                offsetX = DpiHelper.TransformToDeviceX(mainVisual, offset.X);
            }
            else
            {
                offsetX = DpiHelper.TransformToDeviceX(mainVisual,
                                                       offset.X - targetSize.Width - rtlHorizontalOffset);
            }

            return(new PositioningData(
                       mainVisual, offsetX,
                       popupSize, targetSize,
                       locationX, locationY,
                       screenHeight, screenWidth));
        }
예제 #3
0
        private CustomPopupPlacement[] ComboBoxCustomPopupPlacementCallback(
            Size popupSize, Size targetSize, Point offset)
        {
            var visualAncestry = PlacementTarget.GetVisualAncestry().ToList();

            SetupBackground(visualAncestry);

            SetupVisiblePlacementWidth(visualAncestry);

            var locationFromScreen = PlacementTarget.PointToScreen(new Point(0, 0));

            var mainVisual = visualAncestry.OfType <Visual>().LastOrDefault();

            if (mainVisual == null)
            {
                return(new CustomPopupPlacement[0]);
            }

            var screenWidth  = (int)DpiHelper.TransformToDeviceX(mainVisual, SystemParameters.PrimaryScreenWidth);
            var screenHeight = (int)DpiHelper.TransformToDeviceY(mainVisual, SystemParameters.PrimaryScreenHeight);

            var locationX = (int)locationFromScreen.X % screenWidth;
            var locationY = (int)locationFromScreen.Y % screenHeight;

            var realOffsetX = (popupSize.Width - targetSize.Width) / 2.0;

            double    offsetX;
            const int rtlHorizontalOffset = 20;

            if (FlowDirection == FlowDirection.LeftToRight)
            {
                offsetX = DpiHelper.TransformToDeviceX(mainVisual, offset.X);
            }
            else
            {
                offsetX = DpiHelper.TransformToDeviceX(mainVisual,
                                                       offset.X - targetSize.Width - rtlHorizontalOffset);
            }


            if (locationX + popupSize.Width - realOffsetX > screenWidth ||
                locationX - realOffsetX < 0)
            {
                SetChildTemplateIfNeed(DefaultContentTemplate);

                var defaultVerticalOffsetIndepent = DpiHelper.TransformToDeviceY(mainVisual, DefaultVerticalOffset);
                var newY = locationY + popupSize.Height > screenHeight
                    ? -(defaultVerticalOffsetIndepent + popupSize.Height)
                    : defaultVerticalOffsetIndepent + targetSize.Height;

                return(new[] { new CustomPopupPlacement(new Point(offsetX, newY), PopupPrimaryAxis.Horizontal) });
            }

            if (locationY + popupSize.Height > screenHeight)
            {
                SetChildTemplateIfNeed(UpContentTemplate);

                var upVerticalOffsetIndepent = DpiHelper.TransformToDeviceY(mainVisual, UpVerticalOffset);
                var newY = upVerticalOffsetIndepent - popupSize.Height + targetSize.Height;

                return(new[] { new CustomPopupPlacement(new Point(offsetX, newY), PopupPrimaryAxis.None) });
            }
            else
            {
                SetChildTemplateIfNeed(DownContentTemplate);

                var downVerticalOffsetIndepent = DpiHelper.TransformToDeviceY(mainVisual, DownVerticalOffset);
                var newY = downVerticalOffsetIndepent;

                return(new[] { new CustomPopupPlacement(new Point(offsetX, newY), PopupPrimaryAxis.None) });
            }
        }
        private static CustomPopupPlacement GetDownPopupPlacement(ComboBoxPopup popup, PositioningData data)
        {
            var downVerticalOffsetIndepent = DpiHelper.TransformToDeviceY(data.MainVisual, popup.DownVerticalOffset);

            return(new CustomPopupPlacement(new Point(data.OffsetX, downVerticalOffsetIndepent), PopupPrimaryAxis.None));
        }