我怎样才能控制在什么线程中显示弹出窗口
问题描述:
我使用的是一个弹出窗口的控件。我有一个显示和隐藏它的方法,我需要实现一个功能,以防止在不同线程中显示和隐藏弹出窗口。我可以在非UI线程中显示弹出窗口吗?我怎样才能控制在什么线程中显示弹出窗口
更新
我的问题的主要目标是:
它,方法隐藏应该是在同一个线程不是从什么线程的方法Show启动重要。如何实现这一点?
public void Show()
{
IsShown = true;
if (this.ChildWindowPopup == null)
{
this.ChildWindowPopup = new Popup();
try
{
this.ChildWindowPopup.Child = this;
}
catch (ArgumentException)
{
throw new InvalidOperationException("The control is already shown.");
}
}
if (this.ChildWindowPopup != null && Application.Current.RootVisual != null)
{
// Configure accordingly to the type
InitializeProgressType();
// Show popup
this.ChildWindowPopup.IsOpen = true;
}
}
public void Hide()
{
IsShown = false;
// Restore system tray
SystemTray.IsVisible = currentSystemTrayState;
this.progressBar.IsIndeterminate = false;
this.ChildWindowPopup.IsOpen = false;
}
答
一般在UI组件上工作只能在UI线程中完成。如果你想阻止从UI线程启动特定的弹出窗口,你需要提供一个接口来启动它,以便在内部检查它已经执行的线程 - 可能使用SynchronizationContext或Thread类,但最终它需要通过在UI线程上调用一个方法来显示Popup。
+0
我已经更新了我的问题) – revolutionkpi 2012-03-17 14:29:54
当你隐藏时,你能简单地保存Thread.CurrentThread并检查它是否相同吗? 仍然 - 我会争辩说,这个问题表明另一个问题。你为什么要检查线程?如果目标是为某些操作显示进度条 - 您可以创建一些对象(令牌)来将进度条与操作相关联。我不明白为什么要按照您的建议来管理线程,而不是调试另一个问题。 – 2012-03-18 21:13:55