WPF中手写地图控件(3)——动态加载地图图片

瓦片增加一个Loading动画

可以查看我的另一个博客WPF中自定义Loading图

从中心扩散

进行从里到外的扩散,方向是上左下右。如下图所示

于是我们可以定义一个拥有坐标X跟Y的集合,他允许这个集合,内部使用枚举器的MoveNext自动排序,中心的在前,外面在后。

复制代码
public class SpiralArray : IEnumerable<(int, int)>
{

    protected (int, int) Range;

    public SpiralArray((int, int) range)
    {
        Range = range;
    }

    public IEnumerator<(int, int)> GetEnumerator()
    {
        return new SpiralArrayIEnumerator(Range);
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

public class SpiralArrayIEnumerator : IEnumerator<(int, int)>
{
    public int Start;
    public int End;

    public int CenterX;
    public int CenterY;

    private bool IsOver = false;
    private int Direction = 0;// 0 上 1 左 2 : 下 3 : 右
    private int Step = 0;
    private int CurrentMoveSteps = 0;
    private int ChangedDirectionTimes = 0;  //改变方向次数
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="range"></param>
    public SpiralArrayIEnumerator((int, int) range)
    {
        Start = range.Item1;
        End = range.Item2;
        Reset();
    }
    public (int, int) Current { get; set; }
    object IEnumerator.Current => Current;
    public void Dispose()
    {

    }

    public bool MoveNext()
    {
        if(Step == 0)
        {
            Current = (CenterX, CenterY);
            CurrentMoveSteps = 0;
            Step = 1;
            return true;
        }
        else
        {
            // 走一步
            CurrentMoveSteps++;
            // 改变方向
            if(CurrentMoveSteps > Step)
            {
                Direction = (Direction + 1) % 4;
                CurrentMoveSteps = 1;
                ChangedDirectionTimes++;
                if(ChangedDirectionTimes >= 2)
                {
                    // 步长 + 1
                    Step++;
                    ChangedDirectionTimes = 0;
                }
            }
            Move();
            if(Current.Item1 >= End || Current.Item2 >= End || Current.Item1 < Start || Current.Item2 < Start)
                return false;
            return true;
        }
    }
    /// <summary>
    /// 移动一步
    /// </summary>
    private void Move()
    {
        switch (Direction)
        {
            // 上
            case 0:
                Current = (Current.Item1, Current.Item2 - 1);
                break;
            // 左
            case 1:
                Current = (Current.Item1 - 1, Current.Item2);
                break;
            // 下
            case 2:
                Current = (Current.Item1, Current.Item2 + 1);
                break;
            // 右
            case 3:
                Current = (Current.Item1 + 1, Current.Item2);
                break;
            default:
                break;
        }
    }

    public void Reset()
    {
        CenterX = (End + Start) / 2;
        CenterY = (End + Start) / 2;
        Current = (CenterX, CenterY);
        Direction = 0;
        Step = 0;
        ChangedDirectionTimes = 0;
        IsOver = false;
    }
}
相关推荐
Aevget18 小时前
DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(四)?
wpf·界面控件·devexpress·ui开发·.net 10
棉晗榜1 天前
wpf DataGrid控制列是否显示,DataGrid列不会触发Visibility的转换器
wpf
超级种码1 天前
Redis:Redis高可用——副本、哨兵和集群
数据库·redis·wpf
棉晗榜1 天前
wpf给Border添加闪烁边框
wpf
Derrick_itRose1 天前
DevExpress笔记WPF(2)Data Editors and Controls(基础编辑器)
笔记·编辑器·wpf
He BianGu1 天前
【笔记】WPF的Binding中AsyncState的使用方式
笔记·wpf
曹天骄2 天前
Cloudflare KV 使用教程(基于 Wrangler 项目)
wpf
摘星编程2 天前
Flutter for OpenHarmony 实战:Dialog 对话框详解
flutter·wpf
ou.cs2 天前
WPF TreeView 自动展开所有节点:附加行为(Attached Behavior)保姆级实现教程
c#·.net·wpf
一念春风2 天前
可视化视频编辑(WPF C#)
开发语言·c#·wpf