使用装饰器的方式弹出等待遮罩层,可用于窗体和各个控件的等待显示,具体样式可以在模板中进行调整

效果如下图:

 

 

使用方式:

弹出:this.Busy("asd");  this=>窗体或控件

关闭:this.UnBusy();

模板代码:

 1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 2                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 3                     xmlns:local="clr-namespace:装饰器Demo">
 4     <Storyboard x:Key="Storyboard">
 5         <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"
 6                                        Storyboard.TargetName="fan"
 7                                        RepeatBehavior="Forever">
 8             <EasingDoubleKeyFrame KeyTime="0"
 9                                   Value="0" />
10             <EasingDoubleKeyFrame KeyTime="0:0:1.5"
11                                   Value="360" />
12         </DoubleAnimationUsingKeyFrames>
13     </Storyboard>
14     <Style TargetType="{x:Type local:LoadingUI}">
15         <Setter Property="Template">
16             <Setter.Value>
17                 <ControlTemplate TargetType="{x:Type local:LoadingUI}">
18                     <Border Background="{TemplateBinding Background}"
19                             BorderBrush="{TemplateBinding BorderBrush}"
20                             BorderThickness="{TemplateBinding BorderThickness}">
21                         <Image Width="30"
22                                Height="30"
23                                x:Name="fan"
24                                Source="/装饰器Demo;component/Images/loading.png"
25                                HorizontalAlignment="Center"
26                                VerticalAlignment="Center"
27                                RenderTransformOrigin="0.5,0.5"
28                                Margin="5"
29                                Opacity="0.8">
30                             <Image.RenderTransform>
31                                 <TransformGroup>
32                                     <ScaleTransform />
33                                     <SkewTransform />
34                                     <RotateTransform />
35                                     <TranslateTransform />
36                                 </TransformGroup>
37                             </Image.RenderTransform>
38                         </Image>
39                     </Border>
40                     <ControlTemplate.Triggers>
41                         <EventTrigger RoutedEvent="FrameworkElement.Loaded">
42                             <BeginStoryboard Storyboard="{StaticResource Storyboard}" />
43                         </EventTrigger>
44                     </ControlTemplate.Triggers>
45                 </ControlTemplate>
46             </Setter.Value>
47         </Setter>
48     </Style>
49 </ResourceDictionary>
View Code

Cs代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Windows;
  7 using System.Windows.Controls;
  8 using System.Windows.Documents;
  9 using System.Windows.Media;
 10 
 11 namespace 装饰器Demo
 12 {
 13     /// <summary>
 14     /// 忙碌
 15     /// </summary>
 16     public static class BusyHelper
 17     {
 18         #region 窗体忙碌
 19         /// <summary>
 20         /// 窗体忙碌
 21         /// </summary>
 22         /// <param name="window">目标窗体</param>
 23         /// <param name="title">提示信息</param>
 24         public static void Busy(this Window window, string title = "")
 25         {
 26             var layer = AdornerLayer.GetAdornerLayer(window.Content as UIElement);
 27             var xx = new WaitingAdorner(window.Content as UIElement);
 28             layer.Add(xx);
 29         }
 30         /// <summary>
 31         /// 窗体恢复
 32         /// </summary>
 33         /// <param name="window">目标窗体</param>
 34         public static void UnBusy(this Window window)
 35         {
 36             var layer = AdornerLayer.GetAdornerLayer(window.Content as UIElement);
 37             var ans = layer.GetAdorners(window.Content as UIElement);
 38             foreach (var an in ans)
 39             {
 40                 layer.Remove(an);
 41             }
 42         }
 43         #endregion
 44 
 45         #region 控件忙碌
 46         /// <summary>
 47         /// 控件忙碌
 48         /// </summary>
 49         /// <param name="control">目标控件</param>
 50         /// <param name="title">提示信息</param>
 51         public static void Busy(this FrameworkElement control, string title = "")
 52         {
 53             var layer = AdornerLayer.GetAdornerLayer(control.Parent as UIElement);
 54             var xx = new WaitingAdorner(control as UIElement);
 55             layer.Add(xx);
 56         }
 57         /// <summary>
 58         /// 控件恢复
 59         /// </summary>
 60         /// <param name="control"></param>
 61         public static void UnBusy(this FrameworkElement control)
 62         {
 63             var layer = AdornerLayer.GetAdornerLayer(control.Parent as UIElement);
 64             var ans = layer.GetAdorners(control as UIElement);
 65             foreach (var an in ans)
 66             {
 67                 layer.Remove(an);
 68             }
 69         }
 70         #endregion
 71     }
 72 
 73     /// <summary>
 74     /// 忙碌装饰器
 75     /// </summary>
 76     public class WaitingAdorner : Adorner
 77     {
 78         public static string GetCutScreenName(DependencyObject obj)
 79         {
 80             return (string)obj.GetValue(CutScreenNameProperty);
 81         }
 82         public static void SetCutScreenName(DependencyObject obj, string value)
 83         {
 84             obj.SetValue(CutScreenNameProperty, value);
 85         }
 86         public static readonly DependencyProperty CutScreenNameProperty =
 87             DependencyProperty.RegisterAttached("CutScreenName", typeof(string), typeof(WaitingAdorner), new PropertyMetadata(string.Empty));
 88 
 89         VisualCollection visCollec;
 90         LoadingUI _bd = null;
 91 
 92         public WaitingAdorner(UIElement adorned)
 93             : base(adorned)
 94         {
 95             visCollec = new VisualCollection(this);
 96             visCollec.Add(_bd = new LoadingUI() { BorderThickness = new Thickness(1), BorderBrush = new SolidColorBrush(Colors.Red), Background = new SolidColorBrush(Color.FromArgb(0x33, 0xff, 0x99, 0x00)) });
 97         }
 98 
 99         protected override Size ArrangeOverride(Size finalSize)
100         {
101             _bd.Arrange(new Rect(0, 0, AdornedElement.RenderSize.Width, AdornedElement.RenderSize.Height));
102             return finalSize;
103         }
104 
105         protected override Visual GetVisualChild(int index)
106         {
107             return visCollec[index];
108         }
109 
110         protected override int VisualChildrenCount
111         {
112             get
113             {
114                 return visCollec.Count;
115             }
116         }
117     }
118 
119     /// <summary>
120     /// 自定义控件显示等待
121     /// </summary>
122     public class LoadingUI : ContentControl
123     {
124         static LoadingUI()
125         {
126             DefaultStyleKeyProperty.OverrideMetadata(typeof(LoadingUI), new FrameworkPropertyMetadata(typeof(LoadingUI)));
127         }
128     }
129 }
View Code

源码:装饰器Demo.rar

posted on 2018-04-14 14:27  wq8438  阅读(588)  评论(0)    收藏  举报