Wpf 如何停止用户控件执行过程,直到用户响应用户控件

Wpf 如何停止用户控件执行过程,直到用户响应用户控件,wpf,multithreading,dispatcher,Wpf,Multithreading,Dispatcher,大家好,我们有一个WPF应用程序,它是使用MVVM模式开发的。我们有这样一种体系结构,我们有一些DLL,其中包含一些弹出窗口(WPF窗口),这些弹出窗口在我们的主应用程序中没有实现。 使用一些内部层,我们正在进行一些分析,并根据一些条件动态选择所需的dll,我们通过将该dll的线程与WPF主应用程序线程连接,在主应用程序上显示这些弹出窗口 但现在我们想删除这些弹出窗口,而不是弹出窗口,我们想在主窗口中显示usercontrols,用usercontrol替换所有这些窗口 所以现在我们也面临一些关

大家好,我们有一个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(用户控件)


在这里,我的目的是实现类似于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();