chr
2024-08-07 22beee93f14d042aa184148c53efb79e23416526
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
 
namespace PdmSwPlugin.Commmon.Util.UI
{
    public class MaskAdorner : Adorner
    {
        private UIElement child;
        private TextBox textBox;
 
        public static readonly Dictionary<Visual, MaskAdorner> cache = new Dictionary<Visual, MaskAdorner>();
 
        public MaskAdorner(UIElement adornedElement, string message = null) : base(adornedElement)
        {
            textBox = new TextBox
            {
                TextAlignment = TextAlignment.Center,
                Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)),
                Text = message,
                BorderThickness = new Thickness(0)
            };
            StackPanel stackPanel = new StackPanel()
            {
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)),
            };
            stackPanel.Children.Add(new ProgressBar
            {
                Width = 100,
                Height = 20,
                IsIndeterminate = true
            });
            stackPanel.Children.Add(textBox);
            Child = new Border
            {
                Background = new SolidColorBrush(Color.FromArgb(100, 0, 0, 0)),
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment = VerticalAlignment.Stretch,
                Child = stackPanel
            };
        }
        //Adorner 直接继承自 FrameworkElement,
        //没有Content和Child属性,
        //自己添加一个,方便向其中添加我们的控件
        public UIElement Child
        {
            get => child;
            set
            {
                if (value == null)
                {
                    RemoveVisualChild(child);
                }
                else
                {
                    AddVisualChild(value);
                }
                child = value;
            }
        }
        //重写VisualChildrenCount 表示此控件只有一个子控件
        protected override int VisualChildrenCount => 1;
        //控件计算大小的时候,我们在装饰层上添加的控件也计算一下大小
        protected override Size ArrangeOverride(Size finalSize)
        {
            child?.Arrange(new Rect(finalSize));
            return finalSize;
        }
        //重写GetVisualChild,返回我们添加的控件
        protected override Visual GetVisualChild(int index)
        {
            if (index == 0 && child != null) return child;
            return base.GetVisualChild(index);
        }
 
        public void ShowMessage(string message)
        {
            this.textBox.Text = message;
        }
 
 
        public static void ShowMask(Visual visual, string message = null)
        {
            var sb = cache;
            if (cache.ContainsKey(visual))
            {
                return;
            }
            visual.Dispatcher.Invoke(() =>
            {
                AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(visual);
                if (adornerLayer == null) return;
                Adorner[] ads = adornerLayer.GetAdorners(adornerLayer);
                if (ads != null)
                {
                    foreach (Adorner ad in ads)
                    {
                        if (ad is MaskAdorner adorner)
                        {
                            return;
                        }
                    }
                }
                //创建我们定义的Adorner
                MaskAdorner _adorner = new MaskAdorner(adornerLayer, message);
                //添加到adornerLayer装饰层上
                adornerLayer.Add(_adorner);
                cache.Add(visual, _adorner);
            });
        }
 
        public static void ShowMessage(Visual visual, string message)
        {
            if (!cache.ContainsKey(visual))
            {
                return;
            }
            visual.Dispatcher.Invoke(() =>
            {
                AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(visual);
                MaskAdorner mask = cache[visual];
                if (mask == null)
                {
                    return;
                }
                mask.ShowMessage(message);
            });
        }
 
        public static void HideMask(Visual visual)
        {
            if (!cache.ContainsKey(visual))
            {
                return;
            }
            visual.Dispatcher.Invoke(() =>
            {
                if (cache.ContainsKey(visual))
                {
                    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(visual);
                    adornerLayer.Remove(cache[visual]);
                    cache.Remove(visual);
                }
                //Adorner[] ads = adornerLayer.GetAdorners(adornerLayer);
                //if (ads != null)
                //{
                //    foreach (Adorner ad in ads)
                //    {
                //        if (ad is MaskAdorner)
                //        {
                //            adornerLayer.Remove(ad);
                //        }
                //    }
                //}
            });
        }
    }
}