diff --git a/dev/Generated/TabViewItemTemplateSettings.properties.cpp b/dev/Generated/TabViewItemTemplateSettings.properties.cpp index 279d54eec0..140e40d96a 100644 --- a/dev/Generated/TabViewItemTemplateSettings.properties.cpp +++ b/dev/Generated/TabViewItemTemplateSettings.properties.cpp @@ -14,6 +14,7 @@ namespace winrt::Microsoft::UI::Xaml::Controls #include "TabViewItemTemplateSettings.g.cpp" GlobalDependencyProperty TabViewItemTemplateSettingsProperties::s_IconElementProperty{ nullptr }; +GlobalDependencyProperty TabViewItemTemplateSettingsProperties::s_TabGeometryProperty{ nullptr }; TabViewItemTemplateSettingsProperties::TabViewItemTemplateSettingsProperties() { @@ -33,11 +34,23 @@ void TabViewItemTemplateSettingsProperties::EnsureProperties() ValueHelper::BoxedDefaultValue(), nullptr); } + if (!s_TabGeometryProperty) + { + s_TabGeometryProperty = + InitializeDependencyProperty( + L"TabGeometry", + winrt::name_of(), + winrt::name_of(), + false /* isAttached */, + ValueHelper::BoxedDefaultValue(), + nullptr); + } } void TabViewItemTemplateSettingsProperties::ClearProperties() { s_IconElementProperty = nullptr; + s_TabGeometryProperty = nullptr; } void TabViewItemTemplateSettingsProperties::IconElement(winrt::IconElement const& value) @@ -52,3 +65,16 @@ winrt::IconElement TabViewItemTemplateSettingsProperties::IconElement() { return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_IconElementProperty)); } + +void TabViewItemTemplateSettingsProperties::TabGeometry(winrt::Geometry const& value) +{ + [[gsl::suppress(con)]] + { + static_cast(this)->SetValue(s_TabGeometryProperty, ValueHelper::BoxValueIfNecessary(value)); + } +} + +winrt::Geometry TabViewItemTemplateSettingsProperties::TabGeometry() +{ + return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_TabGeometryProperty)); +} diff --git a/dev/Generated/TabViewItemTemplateSettings.properties.h b/dev/Generated/TabViewItemTemplateSettings.properties.h index 2d6cba447b..8ca0b724e7 100644 --- a/dev/Generated/TabViewItemTemplateSettings.properties.h +++ b/dev/Generated/TabViewItemTemplateSettings.properties.h @@ -12,9 +12,14 @@ class TabViewItemTemplateSettingsProperties void IconElement(winrt::IconElement const& value); winrt::IconElement IconElement(); + void TabGeometry(winrt::Geometry const& value); + winrt::Geometry TabGeometry(); + static winrt::DependencyProperty IconElementProperty() { return s_IconElementProperty; } + static winrt::DependencyProperty TabGeometryProperty() { return s_TabGeometryProperty; } static GlobalDependencyProperty s_IconElementProperty; + static GlobalDependencyProperty s_TabGeometryProperty; static void EnsureProperties(); static void ClearProperties(); diff --git a/dev/TabView/TabView.idl b/dev/TabView/TabView.idl index d7bf908568..c13800b299 100644 --- a/dev/TabView/TabView.idl +++ b/dev/TabView/TabView.idl @@ -178,7 +178,17 @@ unsealed runtimeclass TabViewItemTemplateSettings : Windows.UI.Xaml.DependencyOb Windows.UI.Xaml.Controls.IconElement IconElement; + [MUX_PUBLIC_V2] + { + Windows.UI.Xaml.Media.Geometry TabGeometry; + } + static Windows.UI.Xaml.DependencyProperty IconElementProperty{ get; }; + + [MUX_PUBLIC_V2] + { + static Windows.UI.Xaml.DependencyProperty TabGeometryProperty{ get; }; + } } } diff --git a/dev/TabView/TabView.xaml b/dev/TabView/TabView.xaml index 205d8b398b..20e4638f9f 100755 --- a/dev/TabView/TabView.xaml +++ b/dev/TabView/TabView.xaml @@ -391,15 +391,12 @@ - - - - + + - @@ -413,15 +410,12 @@ - - - - + + - @@ -435,15 +429,12 @@ - - - - + + - @@ -635,14 +626,6 @@ Width="4" Data="M4 0C4 1.19469 3.47624 2.26706 2.64582 3H0C1.65685 3 3 1.65685 3 0H4Z" /> - - - + Margin="-4,0,-4,0" + Visibility="Collapsed" + Data="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TabViewTemplateSettings.TabGeometry}" /> ()); Loaded({ this, &TabViewItem::OnLoaded }); + SizeChanged({ this, &TabViewItem::OnSizeChanged }); RegisterPropertyChangedCallback(winrt::SelectorItem::IsSelectedProperty(), { this, &TabViewItem::OnIsSelectedPropertyChanged }); RegisterPropertyChangedCallback(winrt::Control::ForegroundProperty(), { this, &TabViewItem::OnForegroundPropertyChanged }); @@ -28,8 +29,6 @@ TabViewItem::TabViewItem() void TabViewItem::OnApplyTemplate() { - auto popupRadius = unbox_value(ResourceAccessor::ResourceLookup(*this, box_value(c_overlayCornerRadiusKey))); - winrt::IControlProtected controlProtected{ *this }; m_headerContentPresenter.set(GetTemplateChildT(L"ContentPresenter", controlProtected)); @@ -97,7 +96,33 @@ void TabViewItem::OnApplyTemplate() UpdateCloseButton(); UpdateForeground(); - UpdateWidthModeVisualState(); + UpdateWidthModeVisualState(); + UpdateTabGeometry(); +} + +void TabViewItem::UpdateTabGeometry() +{ + auto const templateSettings = winrt::get_self(TabViewTemplateSettings()); + + auto const height = ActualHeight(); + auto const popupRadius = unbox_value(ResourceAccessor::ResourceLookup(*this, box_value(c_overlayCornerRadiusKey))); + auto const leftCorner = popupRadius.TopLeft; + auto const rightCorner = popupRadius.TopRight; + + // Assumes 4px curving-out corners, which are hardcoded in the markup + auto data = L"F1 M0,%f a 4,4 0 0 0 4,-4 L 4,%f a %f,%f 0 0 1 %f,-%f l %f,0 a %f,%f 0 0 1 %f,%f l 0,%f a 4,4 0 0 0 4,4 Z"; + + WCHAR strOut[1024]; + StringCchPrintf(strOut, ARRAYSIZE(strOut), data, + height - 1, + leftCorner, leftCorner, leftCorner, leftCorner, leftCorner, + ActualWidth() - (leftCorner + rightCorner), + rightCorner, rightCorner, rightCorner, rightCorner, + height - (4 + rightCorner + 1)); + + const auto geometry = winrt::XamlReader::Load(strOut).try_as(); + + templateSettings->TabGeometry(geometry); } void TabViewItem::OnLoaded(const winrt::IInspectable& sender, const winrt::RoutedEventArgs& args) @@ -110,6 +135,11 @@ void TabViewItem::OnLoaded(const winrt::IInspectable& sender, const winrt::Route } } +void TabViewItem::OnSizeChanged(const winrt::IInspectable&, const winrt::SizeChangedEventArgs& args) +{ + UpdateTabGeometry(); +} + void TabViewItem::OnIsSelectedPropertyChanged(const winrt::DependencyObject& sender, const winrt::DependencyProperty& args) { diff --git a/dev/TabView/TabViewItem.h b/dev/TabView/TabViewItem.h index f348339525..cb21e9d942 100755 --- a/dev/TabView/TabViewItem.h +++ b/dev/TabView/TabViewItem.h @@ -58,6 +58,9 @@ class TabViewItem : void OnIconSourceChanged(); void UpdateWidthModeVisualState(); + void OnSizeChanged(const winrt::IInspectable&, const winrt::SizeChangedEventArgs& args); + void UpdateTabGeometry(); + bool m_firstTimeSettingToolTip{ true }; winrt::ButtonBase::Click_revoker m_closeButtonClickRevoker{};