Office插件过度动画解决方案

Office VSTO 插件过渡动画解决方案

存在的问题

解决方案

解决割裂的问题

实现各种功能

Office插件属于单线程套间,因此在加载过度动画窗体时当前线程会阻塞,因此逻辑和动画不能在同一个线程上运行

逻辑在新线程上运行

逻辑可以在原来主线程上异步运行,也可以打包为委托传入加载动画窗体异步执行,后者可以实现带中断操作效果的关闭 窗体在原线程运行,可以实现动画与Office融合,一体性效果比较好,缺点就是逻辑必须按异步编写,对编写要求更高

  • 在原线程异步处理,以Show()的方式声明窗体,然后使用Task异步执行逻辑
        var loading = new Loading();
        loading.Show();
        await task;
        loading.Close();
    
  • 逻辑打包到动画窗体处理,首先要对动画窗体进行一个封装,CancellationTokenSource可以抛出一个异常来中断Task ````C# //逻辑 var action = new Action<CancellationToken, Loading>((token, loading)=>{ for(;;) { token.ThrowIfCancellationRequested(); //逻辑 } }); //声明 var loading = new Loading(action); new WindowInteropHelper(loading) { Owner = new IntPtr(Globals.ThisAddIn.Application.Hwnd) }; loading.ShowDialog();
    //动画窗体
    private Task OperateTask = null;
    private CancellationTokenSource tokenSource = null;
    public Loading(Action<CancellationToken, Loading> action)
    {
        tokenSource = new CancellationTokenSource();
        InitializeComponent();
        OperateTask = Task.Run(() =>
        {
            action(tokenSource.Token, this);
        }).ContinueWith(c =>
        {
            Dispatcher.Invoke(() =>
            {
                this.Close();
            });
        });
    }

    public void Close()
    {
        tokenSource.Cancel();
    }
````

其他加载动画

← 返回首页