Skip to content

Commit a2b9726

Browse files
authored
Code Quality: Workaround for CsWinRT access violation (#16793)
1 parent 273c947 commit a2b9726

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

src/Files.App/Data/Items/DetailsLayoutColumnItem.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,16 @@ public override int GetHashCode()
145145

146146
return hashCode;
147147
}
148+
149+
public void Update(DetailsLayoutColumnItem other)
150+
{
151+
UserLengthPixels = other.UserLengthPixels;
152+
NormalMaxLength = other.NormalMaxLength;
153+
UserCollapsed = other.UserCollapsed;
154+
IsResizable = other.IsResizable;
155+
IsHidden = other.IsHidden;
156+
NormalMinLength = other.NormalMinLength;
157+
UserLength = other.UserLength;
158+
}
148159
}
149160
}

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

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -146,22 +146,26 @@ protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
146146

147147
if (FolderSettings?.ColumnsViewModel is not null)
148148
{
149-
ColumnsViewModel.DateCreatedColumn = FolderSettings.ColumnsViewModel.DateCreatedColumn;
150-
ColumnsViewModel.DateDeletedColumn = FolderSettings.ColumnsViewModel.DateDeletedColumn;
151-
ColumnsViewModel.DateModifiedColumn = FolderSettings.ColumnsViewModel.DateModifiedColumn;
152-
ColumnsViewModel.IconColumn = FolderSettings.ColumnsViewModel.IconColumn;
153-
ColumnsViewModel.ItemTypeColumn = FolderSettings.ColumnsViewModel.ItemTypeColumn;
154-
ColumnsViewModel.NameColumn = FolderSettings.ColumnsViewModel.NameColumn;
155-
ColumnsViewModel.PathColumn = FolderSettings.ColumnsViewModel.PathColumn;
156-
ColumnsViewModel.OriginalPathColumn = FolderSettings.ColumnsViewModel.OriginalPathColumn;
157-
ColumnsViewModel.SizeColumn = FolderSettings.ColumnsViewModel.SizeColumn;
158-
ColumnsViewModel.StatusColumn = FolderSettings.ColumnsViewModel.StatusColumn;
159-
ColumnsViewModel.TagColumn = FolderSettings.ColumnsViewModel.TagColumn;
160-
ColumnsViewModel.GitStatusColumn = FolderSettings.ColumnsViewModel.GitStatusColumn;
161-
ColumnsViewModel.GitLastCommitDateColumn = FolderSettings.ColumnsViewModel.GitLastCommitDateColumn;
162-
ColumnsViewModel.GitLastCommitMessageColumn = FolderSettings.ColumnsViewModel.GitLastCommitMessageColumn;
163-
ColumnsViewModel.GitCommitAuthorColumn = FolderSettings.ColumnsViewModel.GitCommitAuthorColumn;
164-
ColumnsViewModel.GitLastCommitShaColumn = FolderSettings.ColumnsViewModel.GitLastCommitShaColumn;
149+
// Don't assign the columns view model directly, instead update each property individually using the Update method.
150+
// This is done to workaround a bug where CsWinRT doesn't properly track the memory of the object so that
151+
// an invalid memory access can occur when the object is moved.
152+
// See https://github.com/microsoft/CsWinRT/issues/1834.
153+
ColumnsViewModel.DateCreatedColumn.Update(FolderSettings.ColumnsViewModel.DateCreatedColumn);
154+
ColumnsViewModel.DateDeletedColumn.Update(FolderSettings.ColumnsViewModel.DateDeletedColumn);
155+
ColumnsViewModel.DateModifiedColumn.Update(FolderSettings.ColumnsViewModel.DateModifiedColumn);
156+
ColumnsViewModel.IconColumn.Update(FolderSettings.ColumnsViewModel.IconColumn);
157+
ColumnsViewModel.ItemTypeColumn.Update(FolderSettings.ColumnsViewModel.ItemTypeColumn);
158+
ColumnsViewModel.NameColumn.Update(FolderSettings.ColumnsViewModel.NameColumn);
159+
ColumnsViewModel.PathColumn.Update(FolderSettings.ColumnsViewModel.PathColumn);
160+
ColumnsViewModel.OriginalPathColumn.Update(FolderSettings.ColumnsViewModel.OriginalPathColumn);
161+
ColumnsViewModel.SizeColumn.Update(FolderSettings.ColumnsViewModel.SizeColumn);
162+
ColumnsViewModel.StatusColumn.Update(FolderSettings.ColumnsViewModel.StatusColumn);
163+
ColumnsViewModel.TagColumn.Update(FolderSettings.ColumnsViewModel.TagColumn);
164+
ColumnsViewModel.GitStatusColumn.Update(FolderSettings.ColumnsViewModel.GitStatusColumn);
165+
ColumnsViewModel.GitLastCommitDateColumn.Update(FolderSettings.ColumnsViewModel.GitLastCommitDateColumn);
166+
ColumnsViewModel.GitLastCommitMessageColumn.Update(FolderSettings.ColumnsViewModel.GitLastCommitMessageColumn);
167+
ColumnsViewModel.GitCommitAuthorColumn.Update(FolderSettings.ColumnsViewModel.GitCommitAuthorColumn);
168+
ColumnsViewModel.GitLastCommitShaColumn.Update(FolderSettings.ColumnsViewModel.GitLastCommitShaColumn);
165169
}
166170

167171
ParentShellPageInstance.ShellViewModel.EnabledGitProperties = GetEnabledGitProperties(ColumnsViewModel);

0 commit comments

Comments
 (0)