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

使用方式:
弹出: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>
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 }
源码:装饰器Demo.rar
浙公网安备 33010602011771号