为什么MahApps.Metro ShowProgressAsync对话框意外重绘?(总是灰色的)

tru*_*ype 3 c# wpf async-await mahapps.metro

所以,我猜测了一下,但看起来我的Mahapps.Metro ShowProgressAsync对话框正在快速重绘,因此它总是显得灰暗.

我有一个程序正在查看基于正则表达式的某些匹配的文档,我已经设置了一个进度条,但是对话框只是显示主应用程序,然后只是将对话框显示为灰色(就像它正在加载它一样)反复很快,或冻结).

如果我在那里放置某种停止,就像一个消息框,那么一切都很好.我不认为我的代码每次都应该重新绘制对话框.我认为它应该只是更新进度条.这是我的代码.

在这个示例代码中,我没有显示我在列表中添加页码的逻辑,而是一遍又一遍地添加了数字42,只是为了缩短它

    private async void RegexMatchProgressBar(Regex regex, string myText, Microsoft.Office.Interop.Word.Document myDoc)
    {
        int charCount = myDoc.Application.ActiveDocument.Characters.Count;

        var myProgressAsync = await this.ShowProgressAsync("WAIT WHILE WE DO STUFF!", "Searching...");
        myProgressAsync.Maximum = charCount;
        myProgressAsync.Minimum = 0;

        Dictionary<String, List<int>> table = new Dictionary<string, List<int>>();
        foreach (Match match in regex.Matches(myText))
        {
            if (!table.ContainsKey(match.Value))
            {
                List<int> page = new List<int>();
                page.Add(42);
                table.Add(match.Value, page);
                myProgressAsync.SetProgress((double)match.Index);

            }
        }
        myProgressAsync.SetProgress(charCount);
        await myProgressAsync.CloseAsync();
    }
Run Code Online (Sandbox Code Playgroud)

C1r*_*dec 9

Operation需要在不同的线程上:

private async void RegexMatchProgressBar(Regex regex, string myText, Microsoft.Office.Interop.Word.Document myDoc)
{
    int charCount = myDoc.Application.ActiveDocument.Characters.Count;

    var myProgressAsync = await this.ShowProgressAsync("WAIT WHILE WE DO STUFF!", "Searching...");
    myProgressAsync.Maximum = charCount;
    myProgressAsync.Minimum = 0;

    await Task.Run(() => 
    {
        Dictionary<String, List<int>> table = new Dictionary<string, List<int>>();
        foreach (Match match in regex.Matches(myText))
        {
            if (!table.ContainsKey(match.Value))
            {
                List<int> page = new List<int>();
                page.Add(42);
                table.Add(match.Value, page);
                myProgressAsync.SetProgress((double)match.Index);

            }
        }

        myProgressAsync.SetProgress(charCount);
    });

    await myProgressAsync.CloseAsync();
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是故意的,但这个方法做了"火与忘记" async void.我建议将Method签名更改为async task在另一侧等待它.此外,Exception将以这种方式处理:异常处理