【问题标题】:C# brief delay after clicking image to display new source单击图像以显示新源后的C#短暂延迟
【发布时间】:2025-12-09 15:55:02
【问题描述】:

我有一个 Windows.Controls.Image,单击它时需要更改其源并显示 x 毫秒,然后导航到新页面。我在更改源后尝试使用 Thread.Sleep(200) 但无论我如何尝试强制重绘更改的源都不会显示,然后当睡眠结束时它会立即更改页面。有谁知道我该怎么做?干杯!

private void ButtonClicked(object sender, MouseButtonEventArgs e)
    {
         Image button = (Image)sender;
         buttons[button.Name].Source = ImageResizer.ResizeImage(System.Drawing.Image.FromFile(@"D:\buttons\" + button.Name + ".png"), buttonSize);
         NavigationService.Navigate(new UpgradeQuiz());
    }

【问题讨论】:

  • 您可以使用 Tick 处理程序启动 DispatcherTimer,该处理程序执行 Navigate 调用(并停止计时器)。出于好奇,您为什么在 WPF 应用程序中使用System.Drawing.Image.FromFile(来自 WinForms),而不是直接从本地文件 URI 加载 WPF BitmapImage?
  • 多年前我只做了非常简短的 c# 编码,大部分都忘记了。我正在做的很多事情都是在网络的帮助下学习的。我的 ImageResizer.ResizeImage 函数采用 System.Drawing.Image,这就是我使用它的原因。如果您有兴趣,代码在这里:pastebin.com/s3VsHkhB 当我了解更多信息时,我将返回以最佳实践进行重构。
  • 您通常不会在 WPF 应用程序中使用 WinForms 类。在没有查看您的 ResizeImage 方法的情况下,我建议将其重写为仅使用来自 System.Windows.Media.Imaging 的类。
  • 我确实尝试过 WPF 来调整大小,但我需要使用 bicubic 来获得所需的图像质量。我找不到如何使用 WPF 进行双三次调整大小。

标签: c# wpf


【解决方案1】:

你可以异步等待:

await Task.Delay(2000);

但是你应该让你的处理程序async:

private async void ButtonClicked(object sender, MouseButtonEventArgs e) // async after private
{
     Image button = (Image)sender;
     buttons[button.Name].Source = ImageResizer.ResizeImage(System.Drawing.Image.FromFile(@"D:\buttons\" + button.Name + ".png"), buttonSize);
     await Task.Delay(2000);
     NavigationService.Navigate(new UpgradeQuiz());
}

【讨论】: