使用laoding动画加载大量用户控件而不冻结app

时间:2017-05-28 14:30:19

标签: c# .net wpf multithreading

所以经过一个多星期的尝试自己解决它,我正式放弃并转向你的帮助。基本上,它不应该这么复杂,所以我不知道为什么它不起作用。我有一个WPF应用程序,其中包含一个名为surprise surpise的主窗口......:Main_Window。 该窗口包含一个名为“pageTransitionControl”的用户控件,该控件根据客户端想要查看的内容更改其内容。 'pageTransitionControl'是支持多个动画等等...无论如何,在所有用户控件中,我有一个叫做ucBanks的preety havy uc。在它显示之前,ucBanks加载大量数据,操纵它并在非常漂亮和智能的图表上显示它。问题是加载它需要一些时间,大约6-7秒,所以我需要UI在那段时间显示“正在加载”动画(另一个用户控件称为“ucSpinner”)。 我正在尝试在不同的线程上加载ucBanks以避免冻结应用程序并且它工作得很好:ucSpinner显示为immidiatlly并且ucBanks正在加载到后台但是当我更改'pageTransitionControl'的内容时我得到此错误: “调用线程无法访问此对象,因为其他线程拥有它”。 我想我基本上都尝试了一切,但我必须错过某事或做错事。 这就是一切开始的地方,加载ucBanks的btn_click事件:

ShowSpinner();
Thread.Sleep(100);
Thread newThread = new Thread(new ThreadStart(LoadUc));
newThread.SetApartmentState(ApartmentState.STA);
newThread.IsBackground = true;
newThread.Start();

这是ShowSpinner方法:

private void ShowSpinner()
{
   ucSpinner.Opacity = 1;
}

这是LoadUc方法:

private void LoadUc()
{
     ucOsh ucOshx = new ucOsh();
     Utils.LoadUc(ucOshx, null, PageTransitions.PageTransitionType.GrowAndFade, true, this, null, true);
}

使用LoadUc我称为静态类,名为'Utils',持有'LoadUc'方法:

public static void LoadUc(System.Windows.Controls.UserControl ucParent, System.Windows.Controls.UserControl ucChild, PageTransitions.PageTransitionType tranType, bool removeChildrens = true, System.Windows.Window w = null, List<Plist.Plist> lst = null, bool hideMenu = false)
        {
            MainWindow win = null;
            if (w != null) { win = (MainWindow)w; }
            else { win = (MainWindow)System.Windows.Window.GetWindow(ucChild); }
            win.Dispatcher.Invoke(
            System.Windows.Threading.DispatcherPriority.ContextIdle, (System.Action)delegate
            {
                win.pageTransitionControl.TransitionType = tranType;
                win.pageTransitionControl.PARAMS = lst;
                win.pageTransitionControl.Tag = ucParent.ToString();
                win.pageTransitionControl.pages.Push(ucParent);
                win.pageTransitionControl.Content = ucParent;  ----------->>>>This is where i get the error!!!
            });
        }

据我所知,主窗口被锁定在另一个线程中,但我无法看到任何其他选项加载它而不冻结整个应用程序。 有没有人对我的问题感到沮丧? SA :-)?

我尝试过:

我尝试与后台工作者合作,我检查了调度程序的所有设置,在线程内外加载了用户控件...

0 个答案:

没有答案