Skip to content

Commit e929ee9

Browse files
committed
Add interface for root child elements
1 parent f40a419 commit e929ee9

File tree

12 files changed

+72
-25
lines changed

12 files changed

+72
-25
lines changed

Microsoft.Toolkit.Uwp.Notifications/Adaptive/Elements/Element_AdaptiveGroup.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace Microsoft.Toolkit.Uwp.Notifications.Adaptive.Elements
88
{
9-
internal sealed class Element_AdaptiveGroup : IElement_TileBindingChild, IElement_ToastBindingChild, IElementWithDescendants, IHaveXmlName
9+
internal sealed class Element_AdaptiveGroup : IElement_TileBindingChild, IElement_ToastBindingChild, IElementWithDescendants, IHaveXmlName, IHaveXmlChildren
1010
{
1111
public IList<Element_AdaptiveSubgroup> Children { get; private set; } = new List<Element_AdaptiveSubgroup>();
1212

@@ -27,5 +27,8 @@ public IEnumerable<object> Descendants()
2727

2828
/// <inheritdoc/>
2929
string IHaveXmlName.Name => "group";
30+
31+
/// <inheritdoc/>
32+
IEnumerable<object> IHaveXmlChildren.Children => Children;
3033
}
3134
}

Microsoft.Toolkit.Uwp.Notifications/Adaptive/Elements/Element_AdaptiveSubgroup.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Microsoft.Toolkit.Uwp.Notifications.Adaptive.Elements
99
{
10-
internal sealed class Element_AdaptiveSubgroup : IElementWithDescendants, IHaveXmlName, IHaveXmlNamedProperties
10+
internal sealed class Element_AdaptiveSubgroup : IElementWithDescendants, IHaveXmlName, IHaveXmlNamedProperties, IHaveXmlChildren
1111
{
1212
internal const AdaptiveSubgroupTextStacking DEFAULT_TEXT_STACKING = AdaptiveSubgroupTextStacking.Default;
1313

@@ -54,6 +54,9 @@ public IEnumerable<object> Descendants()
5454
/// <inheritdoc/>
5555
string IHaveXmlName.Name => "subgroup";
5656

57+
/// <inheritdoc/>
58+
IEnumerable<object> IHaveXmlChildren.Children => Children;
59+
5760
/// <inheritdoc/>
5861
IEnumerable<KeyValuePair<string, object>> IHaveXmlNamedProperties.EnumerateNamedProperties()
5962
{
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System.Collections.Generic;
6+
7+
#nullable enable
8+
9+
namespace Microsoft.Toolkit.Uwp.Notifications;
10+
11+
/// <summary>
12+
/// An interface for a notification XML element with additional children.
13+
/// </summary>
14+
internal interface IHaveXmlChildren
15+
{
16+
/// <summary>
17+
/// Gets the children of the current element.
18+
/// </summary>
19+
IEnumerable<object> Children { get; }
20+
}

Microsoft.Toolkit.Uwp.Notifications/Common/XmlWriterHelper.cs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,15 @@ public static void Write(System.Xml.XmlWriter writer, object element)
5757
{
5858
continue;
5959
}
60+
else if (p.Name == nameof(IHaveXmlChildren.Children) && element is IHaveXmlChildren && p.PropertyType == typeof(IEnumerable<object>))
61+
{
62+
continue;
63+
}
6064

6165
// Otherwise it's an element or collection of elements
6266
else
6367
{
64-
if (propertyValue != null)
65-
{
66-
elements.Add(propertyValue);
67-
}
68+
continue;
6869
}
6970
}
7071

@@ -83,20 +84,14 @@ public static void Write(System.Xml.XmlWriter writer, object element)
8384
}
8485
}
8586

87+
foreach (var child in (element as IHaveXmlChildren)?.Children ?? Enumerable.Empty<object>())
88+
{
89+
elements.Add(child);
90+
}
91+
8692
// Then write children
8793
foreach (object el in elements)
8894
{
89-
// If it's a collection of children
90-
if (el is IEnumerable)
91-
{
92-
foreach (object child in el as IEnumerable)
93-
{
94-
Write(writer, child);
95-
}
96-
97-
continue;
98-
}
99-
10095
// Otherwise just write the single element
10196
Write(writer, el);
10297
}

Microsoft.Toolkit.Uwp.Notifications/Tiles/Elements/Element_Tile.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5+
using System.Collections.Generic;
6+
57
namespace Microsoft.Toolkit.Uwp.Notifications
68
{
7-
internal sealed class Element_Tile : BaseElement, IHaveXmlName
9+
internal sealed class Element_Tile : BaseElement, IHaveXmlName, IHaveXmlChildren
810
{
911
public Element_TileVisual Visual { get; set; }
1012

1113
/// <inheritdoc/>
1214
string IHaveXmlName.Name => "tile";
15+
16+
/// <inheritdoc/>
17+
IEnumerable<object> IHaveXmlChildren.Children => new[] { Visual };
1318
}
1419
}

Microsoft.Toolkit.Uwp.Notifications/Tiles/Elements/Element_TileBinding.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Microsoft.Toolkit.Uwp.Notifications
99
{
10-
internal sealed class Element_TileBinding : IElementWithDescendants, IHaveXmlName, IHaveXmlNamedProperties
10+
internal sealed class Element_TileBinding : IElementWithDescendants, IHaveXmlName, IHaveXmlNamedProperties, IHaveXmlChildren
1111
{
1212
internal const TileBranding DEFAULT_BRANDING = TileBranding.Auto;
1313
internal const TileTextStacking DEFAULT_TEXT_STACKING = TileTextStacking.Top;
@@ -122,6 +122,9 @@ public IEnumerable<object> Descendants()
122122
/// <inheritdoc/>
123123
string IHaveXmlName.Name => "binding";
124124

125+
/// <inheritdoc/>
126+
IEnumerable<object> IHaveXmlChildren.Children => Children;
127+
125128
/// <inheritdoc/>
126129
IEnumerable<KeyValuePair<string, object>> IHaveXmlNamedProperties.EnumerateNamedProperties()
127130
{

Microsoft.Toolkit.Uwp.Notifications/Tiles/Elements/Element_TileVisual.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Microsoft.Toolkit.Uwp.Notifications
99
{
10-
internal sealed class Element_TileVisual : IHaveXmlName, IHaveXmlNamedProperties
10+
internal sealed class Element_TileVisual : IHaveXmlName, IHaveXmlNamedProperties, IHaveXmlChildren
1111
{
1212
internal const TileBranding DEFAULT_BRANDING = TileBranding.Auto;
1313
internal const bool DEFAULT_ADD_IMAGE_QUERY = false;
@@ -38,6 +38,9 @@ internal sealed class Element_TileVisual : IHaveXmlName, IHaveXmlNamedProperties
3838
/// <inheritdoc/>
3939
string IHaveXmlName.Name => "visual";
4040

41+
/// <inheritdoc/>
42+
IEnumerable<object> IHaveXmlChildren.Children => Bindings;
43+
4144
/// <inheritdoc/>
4245
IEnumerable<KeyValuePair<string, object>> IHaveXmlNamedProperties.EnumerateNamedProperties()
4346
{

Microsoft.Toolkit.Uwp.Notifications/Toasts/Elements/Element_Toast.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Microsoft.Toolkit.Uwp.Notifications
99
{
10-
internal sealed class Element_Toast : BaseElement, IElement_ToastActivatable, IHaveXmlAdditionalProperties, IHaveXmlName, IHaveXmlNamedProperties
10+
internal sealed class Element_Toast : BaseElement, IElement_ToastActivatable, IHaveXmlAdditionalProperties, IHaveXmlName, IHaveXmlNamedProperties, IHaveXmlChildren
1111
{
1212
internal const ToastScenario DEFAULT_SCENARIO = ToastScenario.Default;
1313
internal const Element_ToastActivationType DEFAULT_ACTIVATION_TYPE = Element_ToastActivationType.Foreground;
@@ -85,6 +85,9 @@ public static Element_ToastActivationType ConvertActivationType(ToastActivationT
8585
/// <inheritdoc/>
8686
string IHaveXmlName.Name => "toast";
8787

88+
/// <inheritdoc/>
89+
IEnumerable<object> IHaveXmlChildren.Children => new object[] { Visual, Audio, Actions, Header };
90+
8891
/// <inheritdoc/>
8992
IEnumerable<KeyValuePair<string, object>> IHaveXmlNamedProperties.EnumerateNamedProperties()
9093
{

Microsoft.Toolkit.Uwp.Notifications/Toasts/Elements/Element_ToastActions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace Microsoft.Toolkit.Uwp.Notifications
88
{
9-
internal sealed class Element_ToastActions : IHaveXmlName, IHaveXmlNamedProperties
9+
internal sealed class Element_ToastActions : IHaveXmlName, IHaveXmlNamedProperties, IHaveXmlChildren
1010
{
1111
internal const ToastSystemCommand DEFAULT_SYSTEM_COMMAND = ToastSystemCommand.None;
1212

@@ -18,6 +18,9 @@ internal sealed class Element_ToastActions : IHaveXmlName, IHaveXmlNamedProperti
1818
/// <inheritdoc/>
1919
string IHaveXmlName.Name => "actions";
2020

21+
/// <inheritdoc/>
22+
IEnumerable<object> IHaveXmlChildren.Children => Children;
23+
2124
/// <inheritdoc/>
2225
IEnumerable<KeyValuePair<string, object>> IHaveXmlNamedProperties.EnumerateNamedProperties()
2326
{

Microsoft.Toolkit.Uwp.Notifications/Toasts/Elements/Element_ToastBinding.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Microsoft.Toolkit.Uwp.Notifications
99
{
10-
internal sealed class Element_ToastBinding : IHaveXmlName, IHaveXmlNamedProperties
10+
internal sealed class Element_ToastBinding : IHaveXmlName, IHaveXmlNamedProperties, IHaveXmlChildren
1111
{
1212
public Element_ToastBinding(ToastTemplateType template)
1313
{
@@ -49,6 +49,9 @@ public Element_ToastBinding(ToastTemplateType template)
4949
/// <inheritdoc/>
5050
string IHaveXmlName.Name => "binding";
5151

52+
/// <inheritdoc/>
53+
IEnumerable<object> IHaveXmlChildren.Children => Children;
54+
5255
/// <inheritdoc/>
5356
IEnumerable<KeyValuePair<string, object>> IHaveXmlNamedProperties.EnumerateNamedProperties()
5457
{

0 commit comments

Comments
 (0)