예제 #1
0
        static void OnFrameworkElementLoaded(object sender, RoutedEventArgs e)
        {
            (sender as FrameworkElement).Loaded -= OnFrameworkElementLoaded;
            ShowLoadingContext p = null;

            lock (list)
            {
                foreach (var item in list)
                {
                    if (item.Target == sender)
                    {
                        p = item;
                        break;
                    }
                }

                if (p != null)
                {
                    list.Remove(p);
                }
            }

            if (p != null)
            {
                p.Target.ShowLoading(p.percent, p.loadingName, p.LoadingSize, p.HorizontalAlignment, p.VerticalAlignment, p.Margin, p.Size);
            }
        }
예제 #2
0
        //public static void ShowLoading(this UIElement element, bool isAutoClose=false)
        //{
        //    ShowLoading(element, string.Empty, string.Empty, 60, HorizontalAlignment.Center, VerticalAlignment.Center, null, null, false, Brushes.Gray, null);
        //    Task.Factory.StartNew(() =>
        //    {
        //        Task.Delay(10 * 1000);
        //        if (element == null || element.Dispatcher == null) return;
        //        element.Dispatcher.BeginInvoke(new Action(() => { element.HideLoading(); }));
        //    });
        //}

        //public static void UpdateLoading(this UIElement element, string Percent = "", string LoadingName = "")
        //{
        //    ShowLoading(element, Percent, LoadingName, 60, HorizontalAlignment.Center, VerticalAlignment.Center, null, null, false, Brushes.Gray, null);
        //}

        public static void HideLoading(this UIElement element, bool disableElement = false)
        {
            if (element == null || element.Dispatcher == null)
            {
                return;
            }
            if (element.Dispatcher.CheckAccess())
            {
                element.IsEnabled        = !disableElement;
                element.IsHitTestVisible = true;
                AdornerLayer layer = AdornerLayer.GetAdornerLayer(element);
                if (layer == null)
                {
                    var win = element as Window;
                    if (win != null && win.Content != null && win.Content is UIElement)
                    {
                        element = win.Content as UIElement;
                        layer   = AdornerLayer.GetAdornerLayer(element);
                    }
                    else if (element is FrameworkElement)
                    {
                        FrameworkElement fe = element as FrameworkElement;
                        if (!fe.IsLoaded)
                        {
                            lock (list)
                            {
                                ShowLoadingContext target = null;
                                foreach (var p in list)
                                {
                                    if (p.Target == fe)
                                    {
                                        target = p;
                                        break;
                                    }
                                }

                                if (target != null)
                                {
                                    list.Remove(target);
                                }
                            }

                            fe.Loaded -= OnFrameworkElementLoaded;
                            return;
                        }
                    }
                }

                if (layer != null)
                {
                    LoadingAdorner target = null;
                    var            items  = layer.GetAdorners(element);
                    if (items != null)
                    {
                        foreach (var item in items)
                        {
                            if (item is LoadingAdorner)
                            {
                                target = item as LoadingAdorner;
                                if (target != null)
                                {
                                    layer.Remove(target);
                                    target.Dispose();
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                Action <UIElement, Boolean> action = HideLoading;
                element.Dispatcher.BeginInvoke(action, element, disableElement);
            }
        }
예제 #3
0
        public static void ShowLoading(this UIElement element,
                                       string Percent,
                                       string LoadingName,
                                       double loadingSize = 60,
                                       HorizontalAlignment horizontalAlignment = HorizontalAlignment.Center,
                                       VerticalAlignment verticalAlignment     = VerticalAlignment.Center,
                                       Thickness?margin    = null,
                                       Size?size           = null,
                                       bool disableElement = false,
                                       Brush background    = null,
                                       Brush foreground    = null)
        {
            element.IsEnabled = !disableElement;

            if (element == null || element.Dispatcher == null)
            {
                return;
            }
            if (element.Dispatcher.CheckAccess())
            {
                AdornerLayer layer = AdornerLayer.GetAdornerLayer(element);
                if (layer == null)
                {
                    var win = element as Window;
                    element.IsHitTestVisible = false;
                    if (win != null && win.Content != null && win.Content is UIElement)
                    {
                        element = win.Content as UIElement;
                        //var tag = ((Grid) element).Tag as UIElement;
                        //if (tag != null)
                        //{
                        //    layer = AdornerLayer.GetAdornerLayer(tag);
                        //    element = tag;
                        //}
                        //else
                        //{
                        //    layer = AdornerLayer.GetAdornerLayer(element);
                        //}
                        layer = AdornerLayer.GetAdornerLayer(element);
                    }
                    else if (element is FrameworkElement)
                    {
                        FrameworkElement fe = element as FrameworkElement;
                        if (!fe.IsLoaded)
                        {
                            //此处用匿名委托的好处是ShowLoading的参数可以直接传到匿名委托中,但是却没有办法在HideLoading时注销此匿名委托
                            //在控件未 load 之前调用 ShowLoading 再立刻调用HideLoading时 就会发现控件在Loaded之后会显示遮罩,却无法消失
                            //RoutedEventHandler handler = null;
                            //handler = (s, e) =>
                            //{
                            //    fe.Loaded -= handler;
                            //    (s as FrameworkElement).ShowLoading(loadingSize, horizontalAlignment, verticalAlignment, margin, size);
                            //};
                            //fe.Loaded += handler;

                            ShowLoadingContext p = new ShowLoadingContext {
                                Target = fe, LoadingSize = loadingSize, HorizontalAlignment = horizontalAlignment, VerticalAlignment = verticalAlignment, Margin = margin, Size = size, percent = Percent, loadingName = LoadingName
                            };
                            lock (list)
                            {
                                var exist = false;
                                foreach (var item in list)
                                {
                                    if (item.Target == fe)
                                    {
                                        item.LoadingSize         = loadingSize;
                                        item.HorizontalAlignment = horizontalAlignment;
                                        item.VerticalAlignment   = verticalAlignment;
                                        item.Margin = margin;
                                        item.Size   = size;
                                        exist       = true;
                                        break;
                                    }
                                }

                                if (!exist)
                                {
                                    list.Add(p);
                                    fe.Loaded += OnFrameworkElementLoaded;
                                }
                            }

                            return;
                        }
                    }
                }

                if (layer != null)
                {
                    var  ads      = layer.GetAdorners(element);
                    bool hasFound = false;
                    if (ads != null)
                    {
                        foreach (var ad in ads)
                        {
                            if (ad is LoadingAdorner)
                            {
                                var loading = ad as LoadingAdorner;
                                loading.UpdateLoading(Percent, LoadingName);
                                hasFound = true;
                            }
                        }
                    }

                    if (!hasFound)
                    {
                        layer.Add(new LoadingAdorner(element, Percent, LoadingName)
                        {
                            LoadingSize = loadingSize,
                            LoadingVerticalAlignment   = verticalAlignment,
                            LoadingHorizontalAlignment = horizontalAlignment,
                            LoadingMargin = margin ?? new Thickness(0, 0, 0, 0),
                            Size          = size ?? Size.Empty,
                            Foreground    = foreground,
                            Background    = background,
                        });
                    }
                }
            }
            else
            {
                Action <UIElement, string, string, Double, HorizontalAlignment, VerticalAlignment, Thickness?, Size?, bool, Brush, Brush> action = ShowLoading;
                element.Dispatcher.BeginInvoke(action, element, loadingSize, horizontalAlignment, verticalAlignment, margin, size, disableElement, background, foreground);
            }
        }