From 0b8152b6b2a8669a4209c2d60ea335b796714976 Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Wed, 2 Mar 2022 21:00:35 +0100 Subject: [PATCH] Navigationview: Fix init-once of the GlobalDependencyProperty (#6762) --- dev/NavigationView/NavigationView.cpp | 10 +++++----- dev/NavigationView/NavigationView.h | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dev/NavigationView/NavigationView.cpp b/dev/NavigationView/NavigationView.cpp index 44cef96667..f76f5ac1b2 100644 --- a/dev/NavigationView/NavigationView.cpp +++ b/dev/NavigationView/NavigationView.cpp @@ -3,8 +3,6 @@ #include "pch.h" #include "common.h" -#include -#include #include "NavigationView.h" #include "Vector.h" @@ -223,7 +221,8 @@ NavigationView::NavigationView() m_navigationViewItemsFactory = winrt::make_self(); - std::call_once(s_NavigationViewItemRevokersPropertySet, [this]() { + static const auto s_NavigationViewItemRevokersPropertyInit = []() + { s_NavigationViewItemRevokersProperty = InitializeDependencyProperty( L"NavigationViewItemRevokers", @@ -231,7 +230,8 @@ NavigationView::NavigationView() winrt::name_of(), true /* isAttached */, nullptr /* defaultValue */); - }); + return false; + }(); } void NavigationView::OnSelectionModelChildrenRequested(const winrt::SelectionModel& selectionModel, const winrt::SelectionModelChildrenRequestedEventArgs& e) @@ -3423,7 +3423,7 @@ void NavigationView::ClearNavigationViewItemRevokers(const winrt::NavigationView void NavigationView::ClearAllNavigationViewItemRevokers() { - for (auto const nvi : m_itemsWithRevokerObjects) + for (const auto& nvi : m_itemsWithRevokerObjects) { nvi.SetValue(s_NavigationViewItemRevokersProperty, nullptr); } diff --git a/dev/NavigationView/NavigationView.h b/dev/NavigationView/NavigationView.h index f47612aaa7..bd8213c660 100644 --- a/dev/NavigationView/NavigationView.h +++ b/dev/NavigationView/NavigationView.h @@ -184,12 +184,11 @@ class NavigationView : // displayed by the repeaters in this control. It is used to keep track of the // revokers for NavigationViewItem events and allows them to get revoked when // the item gets cleaned up - GlobalDependencyProperty s_NavigationViewItemRevokersProperty{ nullptr }; + inline static GlobalDependencyProperty s_NavigationViewItemRevokersProperty{ nullptr }; void SetNavigationViewItemRevokers(const winrt::NavigationViewItem& nvi); void ClearNavigationViewItemRevokers(const winrt::NavigationViewItem& nvi); void ClearAllNavigationViewItemRevokers(); - std::set m_itemsWithRevokerObjects{}; - std::once_flag s_NavigationViewItemRevokersPropertySet; + std::set m_itemsWithRevokerObjects; void InvalidateTopNavPrimaryLayout(); // Measure functions for top navigation