• 转一个orbitpanel GIS


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Windows.Foundation;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace App8
    {
        public class orbitpanel:Panel
        {
            int i = 0;
            public int orbitsnunber
            {
                get { return (int)GetValue(OrbitsProperty); }
                set { SetValue(OrbitsProperty,value); }
            }
            public static readonly DependencyProperty OrbitsProperty = DependencyProperty.Register("orbitsnunber", typeof(int), typeof(orbitpanel), new PropertyMetadata(1, OnOrbitsChanged));
            private static void OnOrbitsChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
    {
    
    if ((int)e.NewValue < 1)
    {
    throw new ArgumentException(
    "Orbits must be greater than or equal to 1.");
    }
    }
            public static int GetOrbit(DependencyObject obj)
            {
                return (int)obj.GetValue(OrbitProperty);
            }
            public static void SetOrbit(DependencyObject obj, int value)
            {
                obj.SetValue(OrbitProperty, value);
            }
            public static readonly DependencyProperty OrbitProperty =DependencyProperty.RegisterAttached("Orbit",
    typeof(int),
    typeof(orbitpanel),
    new PropertyMetadata(0));
            protected override Size MeasureOverride(Size availableSize)
            {
                var sortedItems = SortElements();
                double max = 0.0;
                foreach (List<UIElement> orbitItems in sortedItems)
                {
                    if (orbitItems.Count > 0)
                    {
                        foreach (UIElement element in orbitItems)
                        {
                            element.Measure(availableSize);
                            if (element.DesiredSize.Width > max)
                                max = element.DesiredSize.Width;
                            if (element.DesiredSize.Height > max)
                                max = element.DesiredSize.Height;
                        }
                    }
                }
                Size desiredSize = new Size(max * orbitsnunber * 2, max * orbitsnunber * 2);
                if (double.IsInfinity(availableSize.Height) ||
                double.IsInfinity(availableSize.Width))
                    return desiredSize;
                else
                    return availableSize;
    
            }
            protected override Size ArrangeOverride(Size finalSize)
            {
                var sortedItems = SortElements();
                double orbitSpacing = CalculateOrbitSpacing(finalSize);
                foreach (List<UIElement> orbitItems in sortedItems)
                {
                    int count = orbitItems.Count;
                    if (count > 0)
                    {
                        double circumference = 2 * Math.PI * orbitSpacing * (i + 1);
                        double slotSize = Math.Min(orbitSpacing, circumference / count);
                        double maxSize = Math.Min(orbitSpacing, slotSize);
                        double angleIncrement = 360 / count;
                        double currentAngle = 0;
                        Point centerPoint =
                        new Point(finalSize.Width / 2, finalSize.Height / 2);
                        foreach (UIElement element in orbitItems)
                        {
                            double angle = Math.PI / 180 * (currentAngle - 90);
                            double left = orbitSpacing * (i + 1) * Math.Cos(angle);
                            double top = orbitSpacing * (i + 1) * Math.Sin(angle);
                            Rect finalRect = new Rect(
                            centerPoint.X + left - element.DesiredSize.Width / 2,
                            centerPoint.Y + top - element.DesiredSize.Height / 2,
                            element.DesiredSize.Width,
                            element.DesiredSize.Height);
                            element.Arrange(finalRect);
                            currentAngle += angleIncrement;
                        }
                    }
                }
                return base.ArrangeOverride(finalSize);
            }
            private List<UIElement>[] SortElements()
            {
                var list = new List<UIElement>[orbitsnunber];
                for (int i = 0; i < orbitsnunber; i++)
                {
                    if (i == orbitsnunber - 1)
                        list[i] = (from UIElement child in Children
                                   where GetOrbit(child) >= i
                                   select child).ToList<UIElement>();
                    else
                        list[i] = (from UIElement child in Children
                                   where GetOrbit(child) == i
                                   select child).ToList<UIElement>();
                }
                return list;
            }
            private double CalculateOrbitSpacing(Size availableSize)
            {
                double constrainingSize = Math.Min(
                availableSize.Width, availableSize.Height);
                double space = constrainingSize / 2;
                return space / orbitsnunber;
            }
        }
    }
    使用方法

     <local:orbitpanel orbitsnunber="1">
                <Image x:Name="image"  local:orbitpanel.Orbit="0"   HorizontalAlignment="Left" Height="166" PointerEntered="image_PointerEntered_1" PointerExited="image_PointerExited_1"  Margin="449,349,0,0" VerticalAlignment="Top" Width="261" Source="http://img.trip.elong.com/guide/attachments/bc/d1/be/bcd1bef731bbde7796bb55edbed0fc1f.jpg" RenderTransformOrigin="0.5,0.5">               
                </Image>      
            <Image   local:orbitpanel.Orbit="0"   HorizontalAlignment="Left" Height="166" PointerEntered="image_PointerEntered_1" PointerExited="image_PointerExited_1"  Margin="449,349,0,0" VerticalAlignment="Top" Width="261" Source="http://img.trip.elong.com/guide/attachments/bc/d1/be/bcd1bef731bbde7796bb55edbed0fc1f.jpg" RenderTransformOrigin="0.5,0.5">          
            </Image>
            <Image   local:orbitpanel.Orbit="0"   HorizontalAlignment="Left" Height="166" PointerEntered="image_PointerEntered_1" PointerExited="image_PointerExited_1"  Margin="449,349,0,0" VerticalAlignment="Top" Width="261" Source="http://img.trip.elong.com/guide/attachments/bc/d1/be/bcd1bef731bbde7796bb55edbed0fc1f.jpg" RenderTransformOrigin="0.5,0.5">  
            </Image>       
            <Image  local:orbitpanel.Orbit="0"   HorizontalAlignment="Left" Height="166" PointerEntered="image_PointerEntered_1" PointerExited="image_PointerExited_1"  Margin="449,349,0,0" VerticalAlignment="Top" Width="261" Source="http://img.trip.elong.com/guide/attachments/bc/d1/be/bcd1bef731bbde7796bb55edbed0fc1f.jpg" RenderTransformOrigin="0.5,0.5">           
            </Image>
            <Image  local:orbitpanel.Orbit="0"   HorizontalAlignment="Left" Height="166" PointerEntered="image_PointerEntered_1" PointerExited="image_PointerExited_1"  Margin="449,349,0,0" VerticalAlignment="Top" Width="261" Source="http://img.trip.elong.com/guide/attachments/bc/d1/be/bcd1bef731bbde7796bb55edbed0fc1f.jpg" RenderTransformOrigin="0.5,0.5">           
            </Image>
            <Image  local:orbitpanel.Orbit="0"   HorizontalAlignment="Left" Height="166" PointerEntered="image_PointerEntered_1" PointerExited="image_PointerExited_1"  Margin="449,349,0,0" VerticalAlignment="Top" Width="261" Source="http://img.trip.elong.com/guide/attachments/bc/d1/be/bcd1bef731bbde7796bb55edbed0fc1f.jpg" RenderTransformOrigin="0.5,0.5">           
            </Image>

        </local:orbitpanel>

    
    
  • 相关阅读:
    在一个类中写完多线程(sleep 方法和wait 方法的区别)
    final
    Oracle 远程访问配置
    在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标
    C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”
    C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper
    『.NET Core CLI工具文档』(十四)dotnet-install 脚本参考
    『.NET Core CLI工具文档』(十三)dotnet-publish
    『.NET Core CLI工具文档』(十二)dotnet-pack
    『.NET Core CLI工具文档』(十一)dotnet-test
  • 原文地址:https://www.cnblogs.com/gisbeginner/p/2681886.html
Copyright © 2020-2023  润新知