【发布时间】:2020-06-10 17:34:46
【问题描述】:
我有一个 WPF Saraff.Twain 扫描应用程序。选择我拥有的数据源:
private async void selectButton_Click_1(object sender, EventArgs e)
{
try
{
this.EnabledIO = false; //disable some controls
await Task.Run(() => this._twain32.SelectSource());
} ...
}
twain32.SelectSource 显示选择数据源的对话框,但对话框出现在主窗体后面。
当它尝试从数据源获取图像时也会发生这种情况:
private async void acquireButton_Click_1(object sender, EventArgs e)
{
try
{
this.EnabledIO = false; //disable some controls
await Task.Run(() => this._twain32.Acquire());
_twain32.CloseDSM();
} ...
}
有没有办法把对话框放到前面?我尝试过了 最小化然后最大化主窗体,但如果有另一个应用程序正在运行,它无论如何都会显示在它们后面。这让用户非常困惑,因为看起来应用程序被卡住了,即使任务栏显示还有另一个窗口在等待输入。
非常感谢,请原谅我在这里发帖缺乏经验。
【问题讨论】:
-
不使用Task.Run时表单会怎样?也在主窗体后面?
-
我没有尝试过......我认为 Task.Run 根据 Saraff.Twain 样本是必要的,我猜。我的意思是在主窗体或窗口的“后面”停留在前面...我必须移动它才能看到对话框
-
试试看。之所以有必要,是因为它会阻塞您的 UI 线程并使其无响应,但这没关系,因为您需要确定它是否是导致问题的后台线程。
-
如果无法查看
_twain32方法的代码,这可能很难解决。 -
处理这个问题的正常方法是为新对话框提供创建对话框的父窗口的句柄。在某些情况下,这是通过选择线程的根窗口自动完成的,但这需要代码在 UI 线程上运行。如果两者都不可能,这似乎是库的问题,因此您可能需要联系提供商以获得支持。
标签: c# wpf async-await