Skip to content

Commit 7404adb

Browse files
committed
Fix NullReferenceException on dispose finalization on NewPipsPager
1 parent a74d89b commit 7404adb

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

CollapseLauncher/Classes/Extension/UIElementExtensions.UnsafeAccessorExtensions.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.UI.Input;
22
using Microsoft.UI.Xaml;
33
using System.Runtime.CompilerServices;
4+
using WinRT;
45

56
#nullable enable
67
namespace CollapseLauncher.Extension
@@ -25,5 +26,20 @@ internal static T WithCursor<T>(this T element, InputCursor inputCursor) where T
2526
element.SetCursor(inputCursor);
2627
return element;
2728
}
29+
30+
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_disposedFlags")]
31+
private static extern ref int GetObjectReferenceDisposeFlags(this IObjectReference obj);
32+
33+
/// <summary>
34+
/// Check whether a WinRT object has been disposed.
35+
/// </summary>
36+
/// <returns><see langword="true"/> if object is already disposed. Otherwise, <see langword="false"/>.</returns>
37+
internal static bool IsObjectDisposed(this IWinRTObject winRtObject)
38+
{
39+
IObjectReference reference = winRtObject.NativeObject;
40+
ref int disposeFlags = ref reference.GetObjectReferenceDisposeFlags();
41+
42+
return disposeFlags > 0;
43+
}
2844
}
2945
}

CollapseLauncher/XAMLs/Theme/CustomControls/NewPipsPager/NewPipsPager.Templates.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,15 @@ private void ApplyNavigationButtonEvents()
8080

8181
private void UnapplyNavigationButtonEvents()
8282
{
83-
_previousPageButton.Click -= PreviousPageButton_OnClick;
84-
_nextPageButton.Click -= NextPageButton_OnClick;
83+
if (!_previousPageButton.IsObjectDisposed())
84+
{
85+
_previousPageButton.Click -= PreviousPageButton_OnClick;
86+
}
87+
88+
if (!_nextPageButton.IsObjectDisposed())
89+
{
90+
_nextPageButton.Click -= NextPageButton_OnClick;
91+
}
8592
}
8693

8794
private void ApplyKeyPressEvents()
@@ -104,7 +111,10 @@ private void ApplyItemsRepeaterEvents()
104111

105112
private void UnapplyItemsRepeaterEvents()
106113
{
107-
_pipsPagerItemsRepeater.ElementPrepared -= ItemsRepeater_ElementPrepared;
114+
if (!_pipsPagerItemsRepeater.IsObjectDisposed())
115+
{
116+
_pipsPagerItemsRepeater.ElementPrepared -= ItemsRepeater_ElementPrepared;
117+
}
108118
}
109119

110120
#endregion

0 commit comments

Comments
 (0)