您好我们有一个使用MVVM模式开发的WPF应用程序。我们有这样的架构,我们有一些DLL,其中包含一些POP UP(WPF Windows),这些都没有被我们的主应用程序重新发布。 使用一些内部层我们正在进行一些分析并根据某些条件动态选择所需的dll,我们通过将该dll的线程与WPF主应用程序线程连接来显示主应用程序上的弹出窗口。
但是现在我们要删除那些弹出窗口而不是弹出窗口,我们希望通过用usercontrol替换所有这些窗口来在主窗口中显示usercontrol。
所以现在我们也遇到了dll中线程的一些问题,再次从dll我们将usercontrol对象发送到主应用程序并能够加载到主应用程序中。
但在早些时候显示弹出窗口时,我们使用了window.ShowDialog,这将停止该dll中的进一步处理,直到用户响应。
但是现在我们将这些窗口更改为usercontrols并且我们在usercontrol中没有任何这样的机制会停止进一步处理,直到用户对它做出响应,所以在用户响应dll中的执行之前会进入我们不想要的下一级别。
任何人都可以帮助在显示或加载用户控件时如何获得Window.ShowDialog()等效功能吗?
我们尝试在usercontrol中的无限循环中设置一些标志,直到用户响应,但我们再次遇到wpf线程问题。
嗨,这是代码片段和细节:
我们有一个名为XYZTest.dll的DLL,它是用户库类型,我们有一些wpf窗口,它将从其他类Package.cs中的同一个DLL中调用,如下所示:
If(somecount>0)
{
MessagePanel messagePanel=new MessagePanel(request.ClientInfo.IPAddress);
messagePanel.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
messagePanel.ShowDialog();
}
Return obj;
在上面的代码中,直到用户响应上面的窗口,执行过程不再进一步......
这个XYZTest.dll是由业务层动态调用的,使用以下代码我们将这个线程附加到主应用程序或线程,这是我们的... ...
Thread thread = new Thread((ThreadStart)delegate { retrunObject = invoke(requestObject); });
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start();
thread.Join();
return retrunObject;
但是现在我们不想显示弹出窗口,因此我想将所有窗口更改为用户控件,并希望动态地在主应用程序中显示受尊重的用户控件。
所以现在我们更改了类似的代码......
PangaeaServerApplication.App.Current.Dispatcher.Invoke((Action)(() =>
{
MessagePanelUserControl userControl = new MessagePanelUserControl();
MainApplication.ViewModel.MainWindowViewModel.ADDClientUUTPopUP( userControl);
while (true)
{
if (isRunning == false)
{
break;
}
else
{
userControl.trigger.WaitOne(2000);
}
}
}));
Thread newWindowThread = new Thread(new ThreadStart(() =>
{
// Create our context, and install it:
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
MessagePanelUserControl userControl = new MessagePanelUserControl ();
MainApplication.ViewModel.MainWindowViewModel.ADDClientUUTPopUP(用户控件);
while (true)
{
if (isRunning == false)
{
break;
}
else
{
userControl.trigger.WaitOne(2000);
}
}
System.Windows.Threading.Dispatcher.Run();
}));
newWindowThread.SetApartmentState(ApartmentState.STA);
// Make the thread a background thread
newWindowThread.IsBackground = true;
// Start the thread
newWindowThread.Start();
这里我的目的是实现类似于messagePanel.ShowDialog()的行为;执行不会进一步进行...但在使用autoresentevent时,我正在完成ui绞死,如果我没有使用任何计时器,所有都无法停止执行,直到用户响应......