1using CommunityToolkit.Maui.Markup;
9 private readonly
SvgView innerSvg;
10 private readonly Label innerLabel;
11 private readonly Border innerBorder;
12 private readonly Grid innerGrid;
19 propertyChanged: OnSvgSourceChanged);
26 propertyChanged: OnSvgAspectChanged);
33 propertyChanged: OnSvgTintColorChanged);
40 propertyChanged: OnSvgStyleChanged);
42 public static readonly BindableProperty LabelTextProperty = BindableProperty.Create(
46 propertyChanged: OnLabelTextChanged);
48 public static readonly BindableProperty LabelStyleProperty = BindableProperty.Create(
52 propertyChanged: OnLabelStyleChanged);
56 nameof(LabelPosition),
57 typeof(LabelPosition),
59 defaultValue: LabelPosition.Left,
60 propertyChanged: OnLabelPositionChanged);
67 propertyChanged: OnBorderStyleChanged);
69 public static void OnSvgSourceChanged(BindableObject Bindable,
object OldValue,
object NewValue)
71 ((
SvgButton)Bindable).innerSvg.Source = (string)NewValue;
74 public static void OnSvgAspectChanged(BindableObject Bindable,
object OldValue,
object NewValue)
76 ((
SvgButton)Bindable).innerSvg.Aspect = (Aspect)NewValue;
79 public static void OnSvgTintColorChanged(BindableObject Bindable,
object OldValue,
object NewValue)
81 ((SvgButton)Bindable).innerSvg.TintColor = (Color)NewValue;
84 public static void OnSvgStyleChanged(BindableObject Bindable,
object OldValue,
object NewValue)
86 ((SvgButton)Bindable).innerSvg.Style = (Style)NewValue;
89 public static void OnLabelTextChanged(BindableObject Bindable,
object OldValue,
object NewValue)
91 SvgButton Button = (SvgButton)Bindable;
92 Button.innerLabel.Text = (string)NewValue;
94 if (
string.IsNullOrEmpty(Button.innerLabel.Text))
96 Button.innerGrid.RowSpacing = 0;
97 Button.innerGrid.ColumnSpacing = 0;
98 Button.innerLabel.IsVisible =
false;
102 Button.innerLabel.VerticalOptions = LayoutOptions.Center;
103 Button.innerLabel.IsVisible =
true;
104 switch (Button.LabelPosition)
106 case LabelPosition.Top:
107 Button.innerLabel.Row(0);
108 Button.innerLabel.Column(0);
109 Button.innerSvg.Row(1);
110 Button.innerSvg.Column(0);
111 Button.innerGrid.ColumnSpacing = 0;
112 Button.innerGrid.RowSpacing = 8;
114 case LabelPosition.Bottom:
115 Button.innerLabel.Row(1);
116 Button.innerLabel.Column(0);
117 Button.innerSvg.Row(0);
118 Button.innerSvg.Column(0);
119 Button.innerGrid.ColumnSpacing = 0;
120 Button.innerGrid.RowSpacing = 8;
122 case LabelPosition.Left:
123 Button.innerLabel.Column(0);
124 Button.innerLabel.Row(0);
125 Button.innerSvg.Column(1);
126 Button.innerSvg.Row(0);
127 Button.innerGrid.ColumnSpacing = 8;
128 Button.innerGrid.RowSpacing = 0;
130 case LabelPosition.Right:
131 Button.innerLabel.Column(1);
132 Button.innerLabel.Row(0);
133 Button.innerSvg.Column(0);
134 Button.innerSvg.Row(0);
135 Button.innerGrid.ColumnSpacing = 8;
136 Button.innerGrid.RowSpacing = 0;
142 public static void OnLabelStyleChanged(BindableObject Bindable,
object OldValue,
object NewValue)
144 ((SvgButton)Bindable).innerLabel.Style = (Style)NewValue;
145 ((SvgButton)Bindable).innerLabel.VerticalOptions = LayoutOptions.Center;
146 ((SvgButton)Bindable).innerLabel.HorizontalOptions = LayoutOptions.Center;
149 public static void OnLabelPositionChanged(BindableObject Bindable,
object OldValue,
object NewValue)
151 SvgButton Button = (SvgButton)Bindable;
153 LabelPosition NewPosition = (LabelPosition)NewValue;
154 Button.LabelPosition = NewPosition;
158 case LabelPosition.Top:
159 Button.innerLabel.Row(0);
160 Button.innerLabel.Column(0);
161 Button.innerSvg.Row(1);
162 Button.innerSvg.Column(0);
163 Button.innerGrid.ColumnSpacing = 0;
164 Button.innerGrid.RowSpacing = 8;
166 case LabelPosition.Bottom:
167 Button.innerLabel.Row(1);
168 Button.innerLabel.Column(0);
169 Button.innerSvg.Row(0);
170 Button.innerSvg.Column(0);
171 Button.innerGrid.ColumnSpacing = 0;
172 Button.innerGrid.RowSpacing = 8;
174 case LabelPosition.Left:
175 Button.innerLabel.Column(0);
176 Button.innerLabel.Row(0);
177 Button.innerSvg.Column(1);
178 Button.innerSvg.Row(0);
179 Button.innerGrid.ColumnSpacing = 8;
180 Button.innerGrid.RowSpacing = 0;
182 case LabelPosition.Right:
183 Button.innerLabel.Column(1);
184 Button.innerLabel.Row(0);
185 Button.innerSvg.Column(0);
186 Button.innerSvg.Row(0);
187 Button.innerGrid.ColumnSpacing = 8;
188 Button.innerGrid.RowSpacing = 0;
192 if (
string.IsNullOrEmpty(Button.LabelText))
194 Button.innerGrid.ColumnSpacing = 0;
195 Button.innerGrid.RowSpacing = 0;
199 Button.innerLabel.VerticalOptions = LayoutOptions.Center;
203 public static void OnBorderStyleChanged(BindableObject Bindable,
object OldValue,
object NewValue)
205 ((SvgButton)Bindable).innerBorder.Style = (Style)NewValue;
208 public string SvgSource
214 public Aspect SvgAspect
220 public Color SvgTintColor
226 public Style SvgStyle
232 public string LabelText
234 get => (string)this.GetValue(LabelTextProperty);
235 set => this.SetValue(LabelTextProperty, value);
238 public Style LabelStyle
240 get => (Style)this.GetValue(LabelStyleProperty);
241 set => this.SetValue(LabelStyleProperty, value);
244 public LabelPosition LabelPosition
250 public Style BorderStyle
252 get => (Style)this.GetValue(BorderDataElement.BorderStyleProperty);
253 set => this.SetValue(BorderDataElement.BorderStyleProperty, value);
259 this.innerSvg =
new()
261 Aspect = this.SvgAspect,
262 Style = this.SvgStyle,
263 TintColor = this.SvgTintColor,
264 Source = this.SvgSource
266 this.innerLabel =
new()
268 Text = this.LabelText,
269 Style = this.LabelStyle,
270 VerticalOptions = LayoutOptions.Center,
271 HorizontalOptions = LayoutOptions.Center
273 this.innerGrid =
new()
277 new ColumnDefinition(width: GridLength.Auto),
278 new ColumnDefinition(width: GridLength.Auto)
282 new RowDefinition(height: GridLength.Auto),
283 new RowDefinition(height: GridLength.Auto)
285 HorizontalOptions = LayoutOptions.Center,
286 VerticalOptions = LayoutOptions.Center
289 this.innerGrid.Add(this.innerLabel);
290 this.innerGrid.Add(this.innerSvg);
292 if (
string.IsNullOrEmpty(this.LabelText))
294 this.innerGrid.RowSpacing = 0;
295 this.innerGrid.ColumnSpacing = 0;
296 this.innerLabel.IsVisible =
false;
300 switch (this.LabelPosition)
302 case LabelPosition.Top:
303 this.innerLabel.Row(0);
304 this.innerLabel.Column(0);
305 this.innerSvg.Row(1);
306 this.innerSvg.Column(0);
307 this.innerGrid.ColumnSpacing = 0;
308 this.innerGrid.RowSpacing = 8;
310 case LabelPosition.Bottom:
311 this.innerLabel.Row(1);
312 this.innerLabel.Column(0);
313 this.innerSvg.Row(0);
314 this.innerSvg.Column(0);
315 this.innerGrid.ColumnSpacing = 0;
316 this.innerGrid.RowSpacing = 8;
318 case LabelPosition.Left:
319 this.innerLabel.Column(0);
320 this.innerLabel.Row(0);
321 this.innerSvg.Column(1);
322 this.innerSvg.Row(0);
323 this.innerGrid.ColumnSpacing = 8;
324 this.innerGrid.RowSpacing = 0;
326 case LabelPosition.Right:
327 this.innerLabel.Column(1);
328 this.innerLabel.Row(0);
329 this.innerSvg.Column(0);
330 this.innerSvg.Row(0);
331 this.innerGrid.ColumnSpacing = 8;
332 this.innerGrid.RowSpacing = 0;
337 this.innerBorder =
new()
339 Style = this.BorderStyle,
340 Content = this.innerGrid
343 this.Content = this.innerBorder;
351 this.innerSvg.Dispose();
352 GC.SuppressFinalize(
this);
356 public enum LabelPosition
A custom .NET MAUI control for rendering Scalable Vector Graphics (SVG) files using SkiaSharp and Svg...