Wpf 如何停止用户控件执行过程,直到用户响应用户控件
大家好,我们有一个WPF应用程序,它是使用MVVM模式开发的。我们有这样一种体系结构,我们有一些DLL,其中包含一些弹出窗口(WPF窗口),这些弹出窗口在我们的主应用程序中没有实现。 使用一些内部层,我们正在进行一些分析,并根据一些条件动态选择所需的dll,我们通过将该dll的线程与WPF主应用程序线程连接,在主应用程序上显示这些弹出窗口 但现在我们想删除这些弹出窗口,而不是弹出窗口,我们想在主窗口中显示usercontrols,用usercontrol替换所有这些窗口 所以现在我们也面临一些关于DLL中线程的问题,我们再次从DLL将usercontrol对象发送到主应用程序,并能够在主应用程序中加载 但在前面显示弹出窗口时,我们使用了window.ShowDialog,它将停止该dll中的进一步处理,直到用户响应为止 但是现在我们把这些窗口改成了usercontrols,在usercontrol中没有任何这样的机制,它会停止进一步的处理,直到用户响应它,所以在用户响应之前,dll中的执行会进入我们不想要的下一个级别 在显示或加载用户控件时,任何人都可以帮助获得Window.ShowDialog()等效功能吗 我们尝试在usercontrol中的无限循环中设置一些标志,直到用户响应为止,但即使在那里,我们也再次遇到wpf线程问题 您好,这是代码片段和详细信息: 我们有一个称为某个XYZTest.DLL的DLL,它属于用户库类型,其中我们有一些wpf窗口,它将从其他类Package.cs的同一DLL中调用,如下所示: 初始弹出式方法,其中动态调用dll中的WPF窗口显示为主应用程序上的弹出式窗口: 在上面的代码中,直到用户响应上面的窗口,执行过程才继续 这个XYZTest.dll是由业务层动态调用的,使用下面的代码,我们将这个线程附加到主应用程序或线程,这是我们的ui 动态调用该DLL并将线程连接到主窗口: 但是现在我们不想显示弹出窗口,所以我想将所有窗口都更改为用户控件,并希望在主应用程序中动态显示受尊重的用户控件 所以现在我们改变了代码,就像这样 第一种方法: 第二种方法: MainApplication.ViewModel.MainWindowViewModel.ADDClientUUTPopUP(用户控件)Wpf 如何停止用户控件执行过程,直到用户响应用户控件,wpf,multithreading,dispatcher,Wpf,Multithreading,Dispatcher,大家好,我们有一个WPF应用程序,它是使用MVVM模式开发的。我们有这样一种体系结构,我们有一些DLL,其中包含一些弹出窗口(WPF窗口),这些弹出窗口在我们的主应用程序中没有实现。 使用一些内部层,我们正在进行一些分析,并根据一些条件动态选择所需的dll,我们通过将该dll的线程与WPF主应用程序线程连接,在主应用程序上显示这些弹出窗口 但现在我们想删除这些弹出窗口,而不是弹出窗口,我们想在主窗口中显示usercontrols,用usercontrol替换所有这些窗口 所以现在我们也面临一些关
在这里,我的目的是实现类似于messagePanel.ShowDialog()的行为;执行将不会继续…但在使用autoresentevent时,我会挂起完整的ui,如果我没有使用任何计时器,则无法停止执行,直到用户响应…发布一些代码以了解您的问题。HI@AyyappanSubramanian感谢您对我的查询感兴趣,请查看修改后的帖子以了解更多信息细节。
If(somecount>0)
{
MessagePanel messagePanel=new MessagePanel(request.ClientInfo.IPAddress);
messagePanel.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
messagePanel.ShowDialog();
}
Return obj;
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 ();
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();