如何在用户响应用户控件之前停止用户控制执行过程

时间:2015-04-23 07:56:22

标签: wpf multithreading dispatcher

您好我们有一个使用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中调用,如下所示:

初始弹出方法,我们在主应用程序中弹出动态调用的dll显示WPF窗口:

     If(somecount>0)
{
         MessagePanel  messagePanel=new    MessagePanel(request.ClientInfo.IPAddress);
        messagePanel.WindowStartupLocation =        System.Windows.WindowStartupLocation.CenterScreen;
         messagePanel.ShowDialog();
        }

       Return obj;

在上面的代码中,直到用户响应上面的窗口,执行过程不再进一步......

这个XYZTest.dll是由业务层动态调用的,使用以下代码我们将这个线程附加到主应用程序或线程,这是我们的... ...

动态调用该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绞死,如果我没有使用任何计时器,所有都无法停止执行,直到用户响应......

0 个答案:

没有答案