Skip to content

Commit 529b07c

Browse files
committed
Fix MenuFlyoutAttach #115
1 parent b7de176 commit 529b07c

File tree

2 files changed

+51
-37
lines changed

2 files changed

+51
-37
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<DevWinUI_PatchVersion>1</DevWinUI_PatchVersion>
1818
<DevWinUI_Controls_PatchVersion>1</DevWinUI_Controls_PatchVersion>
1919
<DevWinUI_ContextMenu_PatchVersion>0</DevWinUI_ContextMenu_PatchVersion>
20-
<DevWinUI_Gallery_PatchVersion>1</DevWinUI_Gallery_PatchVersion>
20+
<DevWinUI_Gallery_PatchVersion>2</DevWinUI_Gallery_PatchVersion>
2121

2222
<!-- -Preview -->
2323
<IsPreviewBuild>false</IsPreviewBuild>

dev/DevWinUI.Controls/Common/MenuFlyoutAttach/MenuFlyoutAttach.cs

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ private static void OnSecondaryMenuChanged(DependencyObject d, DependencyPropert
6969
flyout.MenuFlyoutPresenterStyle = Application.Current.Resources["DefaultMenuFlyoutPresenterStyle"] as Style;
7070
}
7171
}
72+
private static void WaitForTemplateParts(MenuFlyoutPresenter presenter, Action<StackPanel, ItemsRepeater, ItemsPresenter> onReady)
73+
{
74+
void handler(object s, object e)
75+
{
76+
var rootStack = DependencyObjectEx.FindDescendant(presenter, "RootStack") as StackPanel;
77+
var secondaryRepeater = DependencyObjectEx.FindDescendant(presenter, "SecondaryItemsHost") as ItemsRepeater;
78+
var mainItems = DependencyObjectEx.FindDescendant(presenter, "MainItemsPresenter") as ItemsPresenter;
79+
80+
if (rootStack != null && secondaryRepeater != null && mainItems != null)
81+
{
82+
presenter.LayoutUpdated -= handler;
83+
onReady(rootStack, secondaryRepeater, mainItems);
84+
}
85+
}
86+
87+
presenter.LayoutUpdated += handler;
88+
}
7289

7390
private static void OnFlyoutOpened(object sender, object e)
7491
{
@@ -79,48 +96,45 @@ private static void OnFlyoutOpened(object sender, object e)
7996
if (popup?.Child is not MenuFlyoutPresenter presenter)
8097
return;
8198

82-
83-
if (DependencyObjectEx.FindDescendant(presenter, "RootStack") is not StackPanel rootStack || DependencyObjectEx.FindDescendant(presenter, "SecondaryItemsHost") is not ItemsRepeater secondaryRepeater || DependencyObjectEx.FindDescendant(presenter, "MainItemsPresenter") is not ItemsPresenter mainItems)
84-
return;
85-
86-
// Bind ItemsRepeater to the collection
87-
secondaryRepeater.ItemsSource = GetSecondaryMenu(flyout).Items;
88-
89-
// Reorder children
90-
var placement = GetSecondaryMenuPlacement(flyout);
91-
rootStack.Children.Clear();
92-
if (placement == MenuFlyoutSecondaryMenuPlacement.Top)
99+
WaitForTemplateParts(presenter, (rootStack, secondaryRepeater, mainItems) =>
93100
{
94-
rootStack.Children.Add(secondaryRepeater);
95-
rootStack.Children.Add(new MenuFlyoutSeparator());
96-
rootStack.Children.Add(mainItems);
97-
}
98-
else
99-
{
100-
rootStack.Children.Add(mainItems);
101-
rootStack.Children.Add(new MenuFlyoutSeparator());
102-
rootStack.Children.Add(secondaryRepeater);
103-
}
101+
secondaryRepeater.ItemsSource = GetSecondaryMenu(flyout).Items;
104102

105-
// Auto-close handling
106-
foreach (var item in GetSecondaryMenu(flyout).Items)
107-
{
108-
if (item is ButtonBase btn)
103+
var placement = GetSecondaryMenuPlacement(flyout);
104+
rootStack.Children.Clear();
105+
if (placement == MenuFlyoutSecondaryMenuPlacement.Top)
109106
{
110-
var oldHandler = GetAutoCloseHandler(btn);
111-
if (oldHandler != null)
112-
{
113-
btn.Click -= oldHandler;
114-
SetAutoCloseHandler(btn, null);
115-
}
107+
rootStack.Children.Add(secondaryRepeater);
108+
rootStack.Children.Add(new MenuFlyoutSeparator());
109+
rootStack.Children.Add(mainItems);
110+
}
111+
else
112+
{
113+
rootStack.Children.Add(mainItems);
114+
rootStack.Children.Add(new MenuFlyoutSeparator());
115+
rootStack.Children.Add(secondaryRepeater);
116+
}
116117

117-
if (GetAutoCloseByClickOnSecondaryMenuItems(flyout))
118+
// Auto-close handling
119+
foreach (var item in GetSecondaryMenu(flyout).Items)
120+
{
121+
if (item is ButtonBase btn)
118122
{
119-
RoutedEventHandler handler = (s, args) => flyout.Hide();
120-
btn.Click += handler;
121-
SetAutoCloseHandler(btn, handler);
123+
var oldHandler = GetAutoCloseHandler(btn);
124+
if (oldHandler != null)
125+
{
126+
btn.Click -= oldHandler;
127+
SetAutoCloseHandler(btn, null);
128+
}
129+
130+
if (GetAutoCloseByClickOnSecondaryMenuItems(flyout))
131+
{
132+
RoutedEventHandler handler = (s, args) => flyout.Hide();
133+
btn.Click += handler;
134+
SetAutoCloseHandler(btn, handler);
135+
}
122136
}
123137
}
124-
}
138+
});
125139
}
126140
}

0 commit comments

Comments
 (0)