|
9 | 9 | #include "BreadcrumbBar.h" |
10 | 10 | #include "BreadcrumbBarItemAutomationPeer.h" |
11 | 11 |
|
| 12 | +#include "velocity.h" |
| 13 | +#include <FrameworkUdk/Containment.h> |
| 14 | + |
| 15 | +// Bug 48360852: [1.4 servicing] BreadcrumbBar leaks in File Explorer |
| 16 | +#define WINAPPSDK_CHANGEID_48360852 48360852 |
| 17 | +// Bug 48634621: [1.4 servicing] File explorer's popup window is hidden by body (z-order issue?) |
| 18 | +#define WINAPPSDK_CHANGEID_48634621 48634621 |
| 19 | +// Bug 48634543: [1.4 servicing] [Watson Failure] caused by FAIL_FAST_FATAL_APP_EXIT_c0000409_Microsoft.UI.Xaml.Controls.dll!BreadcrumbBarItem::CloneEllipsisItemSource |
| 20 | +#define WINAPPSDK_CHANGEID_48634543 48634543 |
| 21 | + |
12 | 22 | namespace winrt::Microsoft::UI::Xaml::Controls |
13 | 23 | { |
14 | 24 | CppWinRTActivatableClassWithBasicFactory(BreadcrumbBarItem) |
@@ -92,6 +102,10 @@ void BreadcrumbBarItem::OnApplyTemplate() |
92 | 102 | if (m_isEllipsisItem) |
93 | 103 | { |
94 | 104 | m_ellipsisFlyout.set(GetTemplateChildT<winrt::Flyout>(s_itemEllipsisFlyoutPartName, controlProtected)); |
| 105 | + if (WinAppSdk::Containment::IsChangeEnabled<WINAPPSDK_CHANGEID_48634621>()) |
| 106 | + { |
| 107 | + m_ellipsisFlyout.get().ShouldConstrainToRootBounds(false); |
| 108 | + } |
95 | 109 | } |
96 | 110 |
|
97 | 111 | m_button.set(GetTemplateChildT<winrt::Button>(s_itemButtonPartName, controlProtected)); |
@@ -149,7 +163,14 @@ void BreadcrumbBarItem::SetParentBreadcrumb(const winrt::BreadcrumbBar& parent) |
149 | 163 | { |
150 | 164 | MUX_ASSERT(!m_isEllipsisDropDownItem); |
151 | 165 |
|
152 | | - m_parentBreadcrumb.set(parent); |
| 166 | + if (WinAppSdk::Containment::IsChangeEnabled<WINAPPSDK_CHANGEID_48360852>()) |
| 167 | + { |
| 168 | + m_parentBreadcrumbWeakRef = winrt::make_weak(parent); |
| 169 | + } |
| 170 | + else |
| 171 | + { |
| 172 | + m_parentBreadcrumb.set(parent); |
| 173 | + } |
153 | 174 | } |
154 | 175 |
|
155 | 176 | void BreadcrumbBarItem::SetEllipsisDropDownItemDataTemplate(const winrt::IInspectable& newDataTemplate) |
@@ -180,7 +201,17 @@ void BreadcrumbBarItem::SetIsEllipsisDropDownItem(bool isEllipsisDropDownItem) |
180 | 201 |
|
181 | 202 | void BreadcrumbBarItem::RaiseItemClickedEvent(const winrt::IInspectable& content, const uint32_t index) |
182 | 203 | { |
183 | | - if (const auto& breadcrumb = m_parentBreadcrumb.get()) |
| 204 | + winrt::BreadcrumbBar breadcrumb; |
| 205 | + if (WinAppSdk::Containment::IsChangeEnabled<WINAPPSDK_CHANGEID_48360852>()) |
| 206 | + { |
| 207 | + breadcrumb = m_parentBreadcrumbWeakRef.get(); |
| 208 | + } |
| 209 | + else |
| 210 | + { |
| 211 | + breadcrumb = m_parentBreadcrumb.get(); |
| 212 | + } |
| 213 | + |
| 214 | + if (breadcrumb) |
184 | 215 | { |
185 | 216 | auto breadcrumbImpl = winrt::get_self<BreadcrumbBar>(breadcrumb); |
186 | 217 | breadcrumbImpl->RaiseItemClickedEvent(content, index); |
@@ -287,13 +318,27 @@ winrt::IInspectable BreadcrumbBarItem::CloneEllipsisItemSource(const winrt::Coll |
287 | 318 | // The new list contains all the elements in reverse order |
288 | 319 | const int itemsSourceSize = ellipsisItemsSource.Size(); |
289 | 320 |
|
290 | | - // The itemsSourceSize should always be at least 1 as it must always contain the ellipsis item |
291 | | - assert(itemsSourceSize > 0); |
292 | | - |
293 | | - for (int i = itemsSourceSize - 1; i >= 0; --i) |
| 321 | + if (WinAppSdk::Containment::IsChangeEnabled<WINAPPSDK_CHANGEID_48634543>()) |
294 | 322 | { |
295 | | - const auto& item = ellipsisItemsSource.GetAt(i); |
296 | | - newItemsSource.Append(item); |
| 323 | + if(itemsSourceSize > 0) |
| 324 | + { |
| 325 | + for (int i = itemsSourceSize - 1; i >= 0; --i) |
| 326 | + { |
| 327 | + const auto& item = ellipsisItemsSource.GetAt(i); |
| 328 | + newItemsSource.Append(item); |
| 329 | + } |
| 330 | + } |
| 331 | + } |
| 332 | + else |
| 333 | + { |
| 334 | + // The itemsSourceSize should always be at least 1 as it must always contain the ellipsis item |
| 335 | + assert(itemsSourceSize > 0); |
| 336 | + |
| 337 | + for (int i = itemsSourceSize - 1; i >= 0; --i) |
| 338 | + { |
| 339 | + const auto& item = ellipsisItemsSource.GetAt(i); |
| 340 | + newItemsSource.Append(item); |
| 341 | + } |
297 | 342 | } |
298 | 343 |
|
299 | 344 | return newItemsSource; |
@@ -431,7 +476,17 @@ void BreadcrumbBarItem::OnEllipsisItemClick(const winrt::IInspectable&, const wi |
431 | 476 | { |
432 | 477 | MUX_ASSERT(!m_isEllipsisDropDownItem); |
433 | 478 |
|
434 | | - if (const auto& breadcrumb = m_parentBreadcrumb.get()) |
| 479 | + winrt::BreadcrumbBar breadcrumb; |
| 480 | + if (WinAppSdk::Containment::IsChangeEnabled<WINAPPSDK_CHANGEID_48360852>()) |
| 481 | + { |
| 482 | + breadcrumb = m_parentBreadcrumbWeakRef.get(); |
| 483 | + } |
| 484 | + else |
| 485 | + { |
| 486 | + breadcrumb = m_parentBreadcrumb.get(); |
| 487 | + } |
| 488 | + |
| 489 | + if (breadcrumb) |
435 | 490 | { |
436 | 491 | if (const auto& breadcrumbImpl = breadcrumb.try_as<BreadcrumbBar>()) |
437 | 492 | { |
@@ -496,7 +551,7 @@ void BreadcrumbBarItem::InstantiateFlyout() |
496 | 551 | { |
497 | 552 | if (const auto& ellipsisFlyout = m_ellipsisFlyout.get()) |
498 | 553 | { |
499 | | - // Create ItemsRepeater and set the DataTemplate |
| 554 | + // Create ItemsRepeater and set the DataTemplate |
500 | 555 | const auto& ellipsisItemsRepeater = winrt::ItemsRepeater(); |
501 | 556 | ellipsisItemsRepeater.Name(s_ellipsisItemsRepeaterPartName); |
502 | 557 | winrt::AutomationProperties::SetName(ellipsisItemsRepeater, s_ellipsisItemsRepeaterAutomationName); |
|
0 commit comments