Skip to content

Commit 8aaf7f8

Browse files
authored
Tabview switch to converter instead of template settings (#2827)
* Switch to converter * Remove negative margins from templatesettings * Fix formatting * Switch to improved existing converter * Remove old converter
1 parent 24cec5c commit 8aaf7f8

11 files changed

+114
-93
lines changed

dev/Common/CornerRadiusToThicknessConverter.cpp

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,85 @@
55
#include <common.h>
66
#include "CornerRadiusToThicknessConverter.h"
77

8-
winrt::Thickness CornerRadiusToThicknessConverter::Convert(winrt::CornerRadius const& radius, winrt::CornerRadiusToThicknessConverterKind const& filterKind)
8+
winrt::Thickness CornerRadiusToThicknessConverter::Convert(winrt::CornerRadius const& radius,
9+
winrt::CornerRadiusToThicknessConverterKind const& filterKind,
10+
double multiplier)
911
{
1012
auto result = winrt::Thickness{};
1113

1214
switch (filterKind)
1315
{
1416
case winrt::CornerRadiusToThicknessConverterKind::FilterLeftAndRightFromTop:
15-
result.Left = radius.TopLeft;
16-
result.Right = radius.TopRight;
17+
result.Left = radius.TopLeft * multiplier;
18+
result.Right = radius.TopRight * multiplier;
1719
result.Top = 0;
1820
result.Bottom = 0;
1921
break;
2022
case winrt::CornerRadiusToThicknessConverterKind::FilterLeftAndRightFromBottom:
21-
result.Left = radius.BottomLeft;
22-
result.Right = radius.BottomRight;
23+
result.Left = radius.BottomLeft * multiplier;
24+
result.Right = radius.BottomRight * multiplier;
2325
result.Top = 0;
2426
result.Bottom = 0;
2527
break;
2628
case winrt::CornerRadiusToThicknessConverterKind::FilterTopAndBottomFromLeft:
2729
result.Left = 0;
2830
result.Right = 0;
29-
result.Top = radius.TopLeft;
30-
result.Bottom = radius.BottomLeft;
31+
result.Top = radius.TopLeft * multiplier;
32+
result.Bottom = radius.BottomLeft * multiplier;
3133
break;
3234
case winrt::CornerRadiusToThicknessConverterKind::FilterTopAndBottomFromRight:
3335
result.Left = 0;
3436
result.Right = 0;
35-
result.Top = radius.TopRight;
36-
result.Bottom = radius.BottomRight;
37+
result.Top = radius.TopRight * multiplier;
38+
result.Bottom = radius.BottomRight * multiplier;
39+
break;
40+
case winrt::CornerRadiusToThicknessConverterKind::FilterTopFromTopLeft:
41+
result.Left = 0;
42+
result.Right = 0;
43+
result.Top = radius.TopLeft * multiplier;
44+
result.Bottom = 0;
45+
break;
46+
case winrt::CornerRadiusToThicknessConverterKind::FilterTopFromTopRight:
47+
result.Left = 0;
48+
result.Right = 0;
49+
result.Top = radius.TopRight * multiplier;
50+
result.Bottom = 0;
51+
break;
52+
case winrt::CornerRadiusToThicknessConverterKind::FilterRightFromTopRight:
53+
result.Left = 0;
54+
result.Right = radius.TopRight * multiplier;
55+
result.Top = 0;
56+
result.Bottom = 0;
57+
break;
58+
case winrt::CornerRadiusToThicknessConverterKind::FilterRightFromBottomRight:
59+
result.Left = 0;
60+
result.Right = radius.BottomRight * multiplier;
61+
result.Top = 0;
62+
result.Bottom = 0;
63+
break;
64+
case winrt::CornerRadiusToThicknessConverterKind::FilterBottomFromBottomRight:
65+
result.Left = 0;
66+
result.Right = 0;
67+
result.Top = 0;
68+
result.Bottom = radius.BottomRight * multiplier;
69+
break;
70+
case winrt::CornerRadiusToThicknessConverterKind::FilterBottomFromBottomLeft:
71+
result.Left = 0;
72+
result.Right = 0;
73+
result.Top = 0;
74+
result.Bottom = radius.BottomLeft * multiplier;
75+
break;
76+
case winrt::CornerRadiusToThicknessConverterKind::FilterLeftFromBottomLeft:
77+
result.Left = radius.BottomLeft * multiplier;
78+
result.Right = 0;
79+
result.Top = 0;
80+
result.Bottom = 0;
81+
break;
82+
case winrt::CornerRadiusToThicknessConverterKind::FilterLeftFromTopLeft:
83+
result.Left = radius.TopLeft * multiplier;
84+
result.Right = 0;
85+
result.Top = 0;
86+
result.Bottom = 0;
3787
break;
3888
}
3989

@@ -47,8 +97,8 @@ winrt::IInspectable CornerRadiusToThicknessConverter::Convert(
4797
winrt::hstring const& language)
4898
{
4999
auto radius = unbox_value<winrt::CornerRadius>(value);
50-
51-
return box_value(Convert(radius, ConversionKind()));
100+
const auto multiplier = Multiplier();
101+
return box_value(Convert(radius, ConversionKind(),multiplier));
52102
}
53103

54104
winrt::IInspectable CornerRadiusToThicknessConverter::ConvertBack(
@@ -58,4 +108,5 @@ winrt::IInspectable CornerRadiusToThicknessConverter::ConvertBack(
58108
winrt::hstring const& language)
59109
{
60110
winrt::throw_hresult(E_NOTIMPL);
111+
61112
}

dev/Common/CornerRadiusToThicknessConverter.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ class CornerRadiusToThicknessConverter :
1010
public CornerRadiusToThicknessConverterProperties
1111
{
1212
public:
13-
winrt::Thickness Convert(
14-
winrt::CornerRadius const& radius,
15-
winrt::CornerRadiusToThicknessConverterKind const& filterKind);
13+
winrt::Thickness Convert(winrt::CornerRadius const& radius,
14+
winrt::CornerRadiusToThicknessConverterKind const& filterKind,
15+
double multiplier);
1616

1717
winrt::IInspectable Convert(
1818
winrt::IInspectable const& value,

dev/Common/CornerRadiusToThicknessConverter.idl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ runtimeclass CornerRadiusToThicknessConverter : Windows.UI.Xaml.DependencyObject
1010

1111
[MUX_DEFAULT_VALUE("winrt::CornerRadiusToThicknessConverterKind::FilterLeftAndRightFromTop")]
1212
CornerRadiusToThicknessConverterKind ConversionKind{ get; set; };
13+
[MUX_DEFAULT_VALUE("1.0f")]
14+
Double Multiplier{ get; set; };
1315

1416
static Windows.UI.Xaml.DependencyProperty ConversionKindProperty{ get; };
17+
static Windows.UI.Xaml.DependencyProperty MultiplierProperty{ get; };
1518
};
1619

1720
[WUXC_VERSION_MUXONLY]
@@ -22,6 +25,14 @@ enum CornerRadiusToThicknessConverterKind
2225
FilterTopAndBottomFromRight,
2326
FilterLeftAndRightFromTop,
2427
FilterLeftAndRightFromBottom,
28+
FilterTopFromTopLeft,
29+
FilterTopFromTopRight,
30+
FilterRightFromTopRight,
31+
FilterRightFromBottomRight,
32+
FilterBottomFromBottomRight,
33+
FilterBottomFromBottomLeft,
34+
FilterLeftFromBottomLeft,
35+
FilterLeftFromTopLeft,
2536
};
2637

2738
}

dev/CommonStyles/CornerRadius_themeresources.xaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,7 @@
3131
<primitives:CornerRadiusToThicknessConverter x:Key="LeftThicknessFilterConverter" ConversionKind="FilterTopAndBottomFromLeft"/>
3232
<primitives:CornerRadiusToThicknessConverter x:Key="RightThicknessFilterConverter" ConversionKind="FilterTopAndBottomFromRight"/>
3333

34+
<primitives:CornerRadiusToThicknessConverter x:Key="TabViewLeftInsetCornerConverter" ConversionKind="FilterLeftFromBottomLeft" Multiplier="-1"/>
35+
<primitives:CornerRadiusToThicknessConverter x:Key="TabViewRightInsetCornerConverter" ConversionKind="FilterRightFromBottomRight" Multiplier="-1"/>
36+
3437
</ResourceDictionary>

dev/Generated/CornerRadiusToThicknessConverter.properties.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ namespace winrt::Microsoft::UI::Xaml::Controls::Primitives
1414
#include "CornerRadiusToThicknessConverter.g.cpp"
1515

1616
GlobalDependencyProperty CornerRadiusToThicknessConverterProperties::s_ConversionKindProperty{ nullptr };
17+
GlobalDependencyProperty CornerRadiusToThicknessConverterProperties::s_MultiplierProperty{ nullptr };
1718

1819
CornerRadiusToThicknessConverterProperties::CornerRadiusToThicknessConverterProperties()
1920
{
@@ -33,11 +34,23 @@ void CornerRadiusToThicknessConverterProperties::EnsureProperties()
3334
ValueHelper<winrt::CornerRadiusToThicknessConverterKind>::BoxValueIfNecessary(winrt::CornerRadiusToThicknessConverterKind::FilterLeftAndRightFromTop),
3435
nullptr);
3536
}
37+
if (!s_MultiplierProperty)
38+
{
39+
s_MultiplierProperty =
40+
InitializeDependencyProperty(
41+
L"Multiplier",
42+
winrt::name_of<double>(),
43+
winrt::name_of<winrt::CornerRadiusToThicknessConverter>(),
44+
false /* isAttached */,
45+
ValueHelper<double>::BoxValueIfNecessary(1.0f),
46+
nullptr);
47+
}
3648
}
3749

3850
void CornerRadiusToThicknessConverterProperties::ClearProperties()
3951
{
4052
s_ConversionKindProperty = nullptr;
53+
s_MultiplierProperty = nullptr;
4154
}
4255

4356
void CornerRadiusToThicknessConverterProperties::ConversionKind(winrt::CornerRadiusToThicknessConverterKind const& value)
@@ -52,3 +65,16 @@ winrt::CornerRadiusToThicknessConverterKind CornerRadiusToThicknessConverterProp
5265
{
5366
return ValueHelper<winrt::CornerRadiusToThicknessConverterKind>::CastOrUnbox(static_cast<CornerRadiusToThicknessConverter*>(this)->GetValue(s_ConversionKindProperty));
5467
}
68+
69+
void CornerRadiusToThicknessConverterProperties::Multiplier(double value)
70+
{
71+
[[gsl::suppress(con)]]
72+
{
73+
static_cast<CornerRadiusToThicknessConverter*>(this)->SetValue(s_MultiplierProperty, ValueHelper<double>::BoxValueIfNecessary(value));
74+
}
75+
}
76+
77+
double CornerRadiusToThicknessConverterProperties::Multiplier()
78+
{
79+
return ValueHelper<double>::CastOrUnbox(static_cast<CornerRadiusToThicknessConverter*>(this)->GetValue(s_MultiplierProperty));
80+
}

dev/Generated/CornerRadiusToThicknessConverter.properties.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@ class CornerRadiusToThicknessConverterProperties
1212
void ConversionKind(winrt::CornerRadiusToThicknessConverterKind const& value);
1313
winrt::CornerRadiusToThicknessConverterKind ConversionKind();
1414

15+
void Multiplier(double value);
16+
double Multiplier();
17+
1518
static winrt::DependencyProperty ConversionKindProperty() { return s_ConversionKindProperty; }
19+
static winrt::DependencyProperty MultiplierProperty() { return s_MultiplierProperty; }
1620

1721
static GlobalDependencyProperty s_ConversionKindProperty;
22+
static GlobalDependencyProperty s_MultiplierProperty;
1823

1924
static void EnsureProperties();
2025
static void ClearProperties();

dev/Generated/TabViewItemTemplateSettings.properties.cpp

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ namespace winrt::Microsoft::UI::Xaml::Controls
1414
#include "TabViewItemTemplateSettings.g.cpp"
1515

1616
GlobalDependencyProperty TabViewItemTemplateSettingsProperties::s_IconElementProperty{ nullptr };
17-
GlobalDependencyProperty TabViewItemTemplateSettingsProperties::s_LeftInsetRadiusMarginProperty{ nullptr };
18-
GlobalDependencyProperty TabViewItemTemplateSettingsProperties::s_RightInsetRadiusMarginProperty{ nullptr };
1917

2018
TabViewItemTemplateSettingsProperties::TabViewItemTemplateSettingsProperties()
2119
{
@@ -35,35 +33,11 @@ void TabViewItemTemplateSettingsProperties::EnsureProperties()
3533
ValueHelper<winrt::IconElement>::BoxedDefaultValue(),
3634
nullptr);
3735
}
38-
if (!s_LeftInsetRadiusMarginProperty)
39-
{
40-
s_LeftInsetRadiusMarginProperty =
41-
InitializeDependencyProperty(
42-
L"LeftInsetRadiusMargin",
43-
winrt::name_of<winrt::Thickness>(),
44-
winrt::name_of<winrt::TabViewItemTemplateSettings>(),
45-
false /* isAttached */,
46-
ValueHelper<winrt::Thickness>::BoxedDefaultValue(),
47-
nullptr);
48-
}
49-
if (!s_RightInsetRadiusMarginProperty)
50-
{
51-
s_RightInsetRadiusMarginProperty =
52-
InitializeDependencyProperty(
53-
L"RightInsetRadiusMargin",
54-
winrt::name_of<winrt::Thickness>(),
55-
winrt::name_of<winrt::TabViewItemTemplateSettings>(),
56-
false /* isAttached */,
57-
ValueHelper<winrt::Thickness>::BoxedDefaultValue(),
58-
nullptr);
59-
}
6036
}
6137

6238
void TabViewItemTemplateSettingsProperties::ClearProperties()
6339
{
6440
s_IconElementProperty = nullptr;
65-
s_LeftInsetRadiusMarginProperty = nullptr;
66-
s_RightInsetRadiusMarginProperty = nullptr;
6741
}
6842

6943
void TabViewItemTemplateSettingsProperties::IconElement(winrt::IconElement const& value)
@@ -78,29 +52,3 @@ winrt::IconElement TabViewItemTemplateSettingsProperties::IconElement()
7852
{
7953
return ValueHelper<winrt::IconElement>::CastOrUnbox(static_cast<TabViewItemTemplateSettings*>(this)->GetValue(s_IconElementProperty));
8054
}
81-
82-
void TabViewItemTemplateSettingsProperties::LeftInsetRadiusMargin(winrt::Thickness const& value)
83-
{
84-
[[gsl::suppress(con)]]
85-
{
86-
static_cast<TabViewItemTemplateSettings*>(this)->SetValue(s_LeftInsetRadiusMarginProperty, ValueHelper<winrt::Thickness>::BoxValueIfNecessary(value));
87-
}
88-
}
89-
90-
winrt::Thickness TabViewItemTemplateSettingsProperties::LeftInsetRadiusMargin()
91-
{
92-
return ValueHelper<winrt::Thickness>::CastOrUnbox(static_cast<TabViewItemTemplateSettings*>(this)->GetValue(s_LeftInsetRadiusMarginProperty));
93-
}
94-
95-
void TabViewItemTemplateSettingsProperties::RightInsetRadiusMargin(winrt::Thickness const& value)
96-
{
97-
[[gsl::suppress(con)]]
98-
{
99-
static_cast<TabViewItemTemplateSettings*>(this)->SetValue(s_RightInsetRadiusMarginProperty, ValueHelper<winrt::Thickness>::BoxValueIfNecessary(value));
100-
}
101-
}
102-
103-
winrt::Thickness TabViewItemTemplateSettingsProperties::RightInsetRadiusMargin()
104-
{
105-
return ValueHelper<winrt::Thickness>::CastOrUnbox(static_cast<TabViewItemTemplateSettings*>(this)->GetValue(s_RightInsetRadiusMarginProperty));
106-
}

dev/Generated/TabViewItemTemplateSettings.properties.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,9 @@ class TabViewItemTemplateSettingsProperties
1212
void IconElement(winrt::IconElement const& value);
1313
winrt::IconElement IconElement();
1414

15-
void LeftInsetRadiusMargin(winrt::Thickness const& value);
16-
winrt::Thickness LeftInsetRadiusMargin();
17-
18-
void RightInsetRadiusMargin(winrt::Thickness const& value);
19-
winrt::Thickness RightInsetRadiusMargin();
20-
2115
static winrt::DependencyProperty IconElementProperty() { return s_IconElementProperty; }
22-
static winrt::DependencyProperty LeftInsetRadiusMarginProperty() { return s_LeftInsetRadiusMarginProperty; }
23-
static winrt::DependencyProperty RightInsetRadiusMarginProperty() { return s_RightInsetRadiusMarginProperty; }
2416

2517
static GlobalDependencyProperty s_IconElementProperty;
26-
static GlobalDependencyProperty s_LeftInsetRadiusMarginProperty;
27-
static GlobalDependencyProperty s_RightInsetRadiusMarginProperty;
2818

2919
static void EnsureProperties();
3020
static void ClearProperties();

dev/TabView/TabView.idl

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,19 +177,8 @@ unsealed runtimeclass TabViewItemTemplateSettings : Windows.UI.Xaml.DependencyOb
177177
TabViewItemTemplateSettings();
178178

179179
Windows.UI.Xaml.Controls.IconElement IconElement;
180-
[WUXC_VERSION_PREVIEW]
181-
{
182-
Windows.UI.Xaml.Thickness LeftInsetRadiusMargin;
183-
Windows.UI.Xaml.Thickness RightInsetRadiusMargin;
184-
}
185180

186181
static Windows.UI.Xaml.DependencyProperty IconElementProperty{ get; };
187-
188-
[WUXC_VERSION_PREVIEW]
189-
{
190-
static Windows.UI.Xaml.DependencyProperty LeftInsetRadiusMarginProperty{ get; };
191-
static Windows.UI.Xaml.DependencyProperty RightInsetRadiusMarginProperty{ get; };
192-
}
193182
}
194183

195184
}

dev/TabView/TabView.xaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,8 @@
625625
Visibility="Collapsed"
626626
VerticalAlignment="Bottom"
627627
Height="{Binding Source={ThemeResource OverlayCornerRadius}, Path=BottomLeft}"
628-
Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TabViewTemplateSettings.LeftInsetRadiusMargin}"
628+
Margin="{Binding Source={ThemeResource OverlayCornerRadius},
629+
Converter={StaticResource TabViewLeftInsetCornerConverter}}"
629630
Stretch="Uniform"
630631
Fill="{ThemeResource TabViewItemHeaderBackgroundSelected}"
631632
Data="M4 0 L4 4 L0 4 A4,4 90 0 0 4 0 Z" />
@@ -636,7 +637,8 @@
636637
Visibility="Collapsed"
637638
VerticalAlignment="Bottom"
638639
Height="{Binding Source={ThemeResource OverlayCornerRadius}, Path=BottomRight}"
639-
Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TabViewTemplateSettings.RightInsetRadiusMargin}"
640+
Margin="{Binding Source={ThemeResource OverlayCornerRadius},
641+
Converter={StaticResource TabViewRightInsetCornerConverter}}"
640642
Stretch="Uniform"
641643
Fill="{ThemeResource TabViewItemHeaderBackgroundSelected}"
642644
Data="M0 0 L0 4 L4 4 A4 4 90 0 1 0 0 Z" />

0 commit comments

Comments
 (0)