/
MaterialResourcesV2.cs
146 lines (132 loc) · 4.99 KB
/
MaterialResourcesV2.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
#if WinUI
using Microsoft.UI.Xaml;
#else
using Windows.UI.Xaml;
#endif
namespace Uno.Material
{
/// <summary>
/// Material resources including colors, layout values and styles
/// </summary>
public class MaterialResourcesV2 : ResourceDictionary
{
private const string StylePrefix = "Material";
public MaterialResourcesV2()
{
Source = new Uri("ms-appx:///Uno.Material/Generated/mergedpages.v2.xaml");
MapStyleInfo();
}
private void MapStyleInfo()
{
var aliasedResources = new ResourceDictionary();
var implicitResources = new ResourceDictionary();
foreach (var (resKey, sharedKey, isDefaultStyle) in GetStyleInfos())
{
var style = GetStyle(resKey);
if (isDefaultStyle)
{
implicitResources.Add(style.TargetType, style);
}
aliasedResources.Add(sharedKey, style);
}
// UWP don't allow for res-dict with Source set to contain resource directly:
// > Local values are not allowed in resource dictionary with Source set
// but, we can add them through merged-dict instead.
this.MergedDictionaries.Add(aliasedResources);
this.MergedDictionaries.Add(implicitResources);
}
private Style GetStyle(string key)
{
if (!this.TryGetValue(key, out var resource) || !(resource is Style style))
{
// uwp: If the {key} style is clearly defined, but we can't find it here.
// And, that it only happens on uwp, and not other uno platforms.
// It means that the style references resources that are not directly included.
// note: Resources used on Style.Setters need to be directly defined/included, those used in Style.Template dont have to be.
throw new ArgumentException($"Missing resource: key={key}");
}
if (style.TargetType == null)
{
throw new InvalidOperationException($"Missing TargetType on style: key={key}");
}
return style;
}
private IEnumerable<(string ResourceKey, string SharedKey, bool IsDefaultStyle)> GetStyleInfos()
{
var result = new List<(string ResourceKey, string SharedKey, bool IsDefaultStyle)>();
Add("MaterialAppBarButtonStyle", isImplicit: true);
Add("MaterialBodyLarge");
Add("MaterialBodyMedium", isImplicit: true);
Add("MaterialBodySmall");
Add("MaterialCalendarDatePickerStyle", isImplicit: true);
Add("MaterialCalendarViewStyle", isImplicit: true);
Add("MaterialCaptionLarge");
Add("MaterialCaptionMedium");
Add("MaterialCaptionSmall");
Add("MaterialCheckBoxStyle", isImplicit: true);
Add("MaterialComboBoxStyle", isImplicit: true);
Add("MaterialCommandBarStyle", isImplicit: true);
Add("MaterialDatePickerStyle", isImplicit: true);
Add("MaterialDisplayLarge");
Add("MaterialDisplayMedium");
Add("MaterialDisplaySmall");
Add("MaterialElevatedButtonStyle");
Add("MaterialFabStyle");
Add("MaterialFilledButtonStyle", isImplicit: true);
Add("MaterialFilledPasswordBoxStyle", isImplicit: true);
Add("MaterialFilledTextBoxStyle", isImplicit: true);
Add("MaterialFilledTonalButtonStyle");
Add("MaterialFlyoutPresenterStyle", isImplicit: true);
Add("MaterialHeadlineLarge");
Add("MaterialHeadlineMedium");
Add("MaterialHeadlineSmall");
Add("MaterialHyperlinkButtonStyle", isImplicit: true);
Add("MaterialIconButtonStyle");
Add("MaterialIconToggleButtonStyle");
Add("MaterialLabelExtraSmall");
Add("MaterialLabelLarge");
Add("MaterialLabelMedium");
Add("MaterialLabelSmall");
Add("MaterialLargeFabStyle");
Add("MaterialListViewItemStyle", isImplicit: true);
Add("MaterialListViewStyle", isImplicit: true);
Add("MaterialMenuFlyoutPresenterStyle", isImplicit: true);
Add("MaterialNavigationViewItemStyle", isImplicit: true);
Add("MaterialNavigationViewStyle", isImplicit: true);
Add("MaterialOutlinedButtonStyle");
Add("MaterialOutlinedPasswordBoxStyle");
Add("MaterialOutlinedTextBoxStyle");
Add("MaterialProgressBarStyle", isImplicit: true);
#if !WinUI
Add("MaterialProgressRingStyle", isImplicit: true);
#endif
Add("MaterialRadioButtonStyle", isImplicit: true);
Add("MaterialSecondaryCheckBoxStyle");
Add("MaterialSecondaryFabStyle");
Add("MaterialSecondaryHyperlinkButtonStyle");
Add("MaterialSecondaryLargeFabStyle");
Add("MaterialSecondaryRadioButtonStyle");
Add("MaterialSecondarySmallFabStyle");
Add("MaterialSliderStyle", isImplicit: true);
Add("MaterialSmallFabStyle");
Add("MaterialSurfaceFabStyle");
Add("MaterialSurfaceLargeFabStyle");
Add("MaterialSurfaceSmallFabStyle");
Add("MaterialTertiaryFabStyle");
Add("MaterialTertiaryLargeFabStyle");
Add("MaterialTertiarySmallFabStyle");
Add("MaterialTextButtonStyle");
Add("MaterialTextToggleButtonStyle", isImplicit: true);
Add("MaterialTitleLarge");
Add("MaterialTitleMedium");
Add("MaterialTitleSmall");
Add("MaterialToggleSwitchStyle", isImplicit: true);
return result;
void Add(string key, string alias = null, bool isImplicit = false) =>
result.Add((key, alias ?? key.Substring(StylePrefix.Length), isImplicit));
}
}
}