Skip to content

Commit b24b280

Browse files
Fix: Properly dispose of column content to prevent memory leaks (#17548)
Co-authored-by: seer-by-sentry[bot] <157164994+seer-by-sentry[bot]@users.noreply.github.com>
1 parent b549af2 commit b24b280

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/Files.App/Views/Layouts/ColumnsLayoutPage.xaml.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,10 @@ public override void Dispose()
162162
{
163163
base.Dispose();
164164

165-
var columnHostItems = ColumnHost.Items.OfType<BladeItem>().Select(blade => blade.Content as Frame);
165+
var columnHostItems = ColumnHost.Items.OfType<BladeItem>().Select(blade => blade.Content as Frame).ToList();
166166
foreach (var frame in columnHostItems)
167167
{
168+
// Unsubscribe all event handlers BEFORE disposing to prevent race conditions
168169
if (frame?.Content is ColumnShellPage shPage)
169170
{
170171
shPage.ContentChanged -= ColumnViewBrowser_ContentChanged;
@@ -179,6 +180,7 @@ public override void Dispose()
179180
if (frame?.Content is UIElement element)
180181
element.GotFocus -= ColumnViewBrowser_GotFocus;
181182

183+
// Dispose content AFTER unsubscribing all event handlers
182184
if (frame?.Content is IDisposable disposable)
183185
disposable.Dispose();
184186
}
@@ -207,9 +209,7 @@ public void DismissOtherBlades(int index)
207209
{
208210
var frame = ColumnHost.ActiveBlades[index + 1].Content as Frame;
209211

210-
if (frame?.Content is IDisposable disposableContent)
211-
disposableContent.Dispose();
212-
212+
// Unsubscribe event handlers BEFORE disposing to prevent race conditions
213213
if ((frame?.Content as ColumnShellPage)?.SlimContentPage is ColumnLayoutPage columnLayout)
214214
{
215215
columnLayout.ItemInvoked -= ColumnViewBase_ItemInvoked;
@@ -220,6 +220,10 @@ public void DismissOtherBlades(int index)
220220
(frame?.Content as UIElement).GotFocus -= ColumnViewBrowser_GotFocus;
221221
(frame?.Content as ColumnShellPage).ContentChanged -= ColumnViewBrowser_ContentChanged;
222222

223+
// Dispose content AFTER unsubscribing event handlers
224+
if (frame?.Content is IDisposable disposableContent)
225+
disposableContent.Dispose();
226+
223227
ColumnHost.Items.RemoveAt(index + 1);
224228
ColumnHost.ActiveBlades.RemoveAt(index + 1);
225229
}

0 commit comments

Comments
 (0)