为什么 MahApps.Metro ShowProgressAsync 对话框意外重绘? (总是灰色的)
Why does MahApps.Metro ShowProgressAsync dialog box redraw unexpectedly? (always grey)
所以,我有点猜测,但看起来我的 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();
}
您的 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();
}
我不知道这是否是故意的,但此方法确实 "Fire and Forget" async void
。我建议将方法签名更改为 async task
以在另一端等待它。此外,将以这种方式处理异常:Exception Handling
所以,我有点猜测,但看起来我的 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();
}
您的 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();
}
我不知道这是否是故意的,但此方法确实 "Fire and Forget" async void
。我建议将方法签名更改为 async task
以在另一端等待它。此外,将以这种方式处理异常:Exception Handling