Как изменить Orbit View в Windows Community Toolkit так, чтобы он располагался сверху, а не по центру слева по центру - PullRequest
0 голосов
/ 27 ноября 2018

Итак, я работаю над Pie Control с Orbit View из набора инструментов сообщества Windows.Pie Control?

Я пытался изменить поведение просмотра орбиты, чтобы упорядочить элемент, начинающийся сверху, а не в левом центре.

Здесь, когда «Просмотр орбиты» имеет только один элемент.Here

Я попытался отследить его и нашел код, который Orbit View использовал для упорядочивания элемента.Но проблема в том, что я ничего не знаю о математике и не знаю, где изменить значение: / Итак, вот код.

    protected override Size ArrangeOverride(Size finalSize)
    {
        var angle = 2 * Math.PI / Children.Count;

        var minDistance = 80;
        var maxDistance = Math.Max(minDistance, (Math.Min(finalSize.Width, finalSize.Height) - OrbitView.MaxItemSize) / 2);

        var elementsProperties = new List<OrbitViewElementProperties>();

        for (var i = 0; i < Children.Count; i++)
        {
            var element = Children.ElementAt(i);

            OrbitViewDataItem orbitViewDataItem = null;
            if (element is FrameworkElement)
            {
                orbitViewDataItem = ((FrameworkElement)element).DataContext as OrbitViewDataItem;
            }

            var d = orbitViewDataItem != null && orbitViewDataItem.Distance >= 0 ? orbitViewDataItem.Distance : 0.5;
            d = Math.Min(d, 1d);

            var distance = (d * (maxDistance - minDistance)) + minDistance;
            var x = distance * Math.Cos((angle * i) + (angle / 2));
            var y = distance * Math.Sin((angle * i) + (angle / 2));

            var x_normalized = (finalSize.Width / 2) + x - (element.DesiredSize.Width / 2);
            var y_normalized = (finalSize.Height / 2) - y - (element.DesiredSize.Height / 2);
            var point = new Point(x_normalized, y_normalized);

            element.Arrange(new Rect(point, element.DesiredSize));

            var elementProperties = new OrbitViewElementProperties()
            {
                XYFromCenter = new Point(x, y),
                DistanceFromCenter = distance,
                Element = element
            };
            elementsProperties.Add(elementProperties);

            if (ItemArranged != null)
            {
                var args = new OrbitViewPanelItemArrangedArgs()
                {
                    ElementProperties = elementProperties,
                    ItemIndex = i
                };
                ItemArranged.Invoke(this, args);
            }
        }

        ItemsArranged?.Invoke(this, new OrbitViewPanelItemsArrangedArgs() { Elements = elementsProperties });

        return finalSize;
    }

Итак, где я могу изменить его, чтобы заставить его начать ставитьэлемент в верхнем центре (0 градусов) вместо левого центра (270 градусов)

Редактировать: Я разветвляю проект и удаляю весь элемент только для нескольких элементов управления: https://github.com/ray1997/WindowsCommunityToolkit/tree/ForJustR Код Iупомянутое выше здесь: https://github.com/ray1997/WindowsCommunityToolkit/blob/ForJustR/Microsoft.Toolkit.Uwp.UI.Controls/OrbitView/OrbitViewPanel.cs строка 90

1 Ответ

0 голосов
/ 27 ноября 2018
var angle = 2 * Math.PI / Children.Count;

Похоже, что угол выражается в радианах.

var distance = (d * (maxDistance - minDistance)) + minDistance;
var x = distance * Math.Cos((angle * i) + (angle / 2));
var y = distance * Math.Sin((angle * i) + (angle / 2));

и здесь он используется для вычисления значений x и y для элементов.Теперь добавление 90 ° или 2 * Math.PI / 4 радианов переместит его на 90 °.

, чтобы вы получили

// offset the first element by 90°
var customOffset = 2 * Math.PI / 4;
var distance = (d * (maxDistance - minDistance)) + minDistance;
var x = distance * Math.Cos((angle * i) + (angle / 2) - customOffset);
var y = distance * Math.Sin((angle * i) + (angle / 2) - customOffset);
...