@@ -206,6 +206,25 @@ public static void SetIsClosable(TabItem element, bool value)
206206 #endregion
207207
208208
209+ #region CloseRequestedEvent
210+
211+ public static readonly RoutedEvent CloseRequestedEvent = EventManager . RegisterRoutedEvent (
212+ "CloseRequested" ,
213+ RoutingStrategy . Bubble ,
214+ typeof ( EventHandler < TabViewTabCloseRequestedEventArgs > ) ,
215+ typeof ( TabItemHelper ) ) ;
216+
217+ public static void AddCloseRequestedHandler ( TabItem tabItem , EventHandler < TabViewTabCloseRequestedEventArgs > handler )
218+ {
219+ tabItem . AddHandler ( CloseRequestedEvent , handler ) ;
220+ }
221+
222+ public static void RemoveCloseRequestedHandler ( TabItem tabItem , EventHandler < TabViewTabCloseRequestedEventArgs > handler )
223+ {
224+ tabItem . RemoveHandler ( CloseRequestedEvent , handler ) ;
225+ }
226+
227+
209228 private static void OnLoaded ( object sender , RoutedEventArgs e )
210229 {
211230 TabItem TabItem = sender as TabItem ;
@@ -257,6 +276,16 @@ void ExecutedCustomCommand(object sender, ExecutedRoutedEventArgs e)
257276 var eargs = new TabViewTabCloseRequestedEventArgs ( TabControlHelper . TabCloseRequestedEvent , item . Content , item ) ;
258277 tabControl . RaiseEvent ( eargs ) ;
259278
279+ // According to WinUI 3 behavior, the TabView's CloseRequested will be fired first,
280+ // then the TabItem's CloseRequested will be fired after that.
281+ // Since WinUI 3 does not have a 'routed' event for TabItem CloseRequested, we may apply
282+ // the same logic here, but adopting a handled check for TabItem CloseRequested event.
283+ // If this is inappropriate, feel free to propose a change.
284+ if ( ! eargs . Handled )
285+ {
286+ item . RaiseEvent ( new TabViewTabCloseRequestedEventArgs ( CloseRequestedEvent , item . Content , item ) ) ;
287+ }
288+
260289 e . Handled = true ;
261290 }
262291
0 commit comments