1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Linq ;
3
4
using System . Windows ;
4
5
using System . Windows . Controls ;
5
6
using System . Windows . Input ;
6
7
using System . Windows . Media ;
7
- using MaterialDesignThemes . Wpf . Transitions ;
8
- using System . Collections . Generic ;
9
8
10
9
namespace MaterialDesignThemes . Wpf
11
10
{
@@ -135,7 +134,7 @@ public Brush TopDrawerBackground
135
134
}
136
135
137
136
public static readonly DependencyProperty IsTopDrawerOpenProperty = DependencyProperty . Register (
138
- nameof ( IsTopDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsDrawerOpenPropertyChangedCallback ) ) ;
137
+ nameof ( IsTopDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsTopDrawerOpenPropertyChangedCallback ) ) ;
139
138
140
139
public bool IsTopDrawerOpen
141
140
{
@@ -164,6 +163,7 @@ public bool TopDrawerCloseOnClickAway
164
163
get { return ( bool ) GetValue ( TopDrawerCloseOnClickAwayProperty ) ; }
165
164
set { SetValue ( TopDrawerCloseOnClickAwayProperty , value ) ; }
166
165
}
166
+
167
167
#endregion
168
168
169
169
#region left drawer
@@ -214,7 +214,7 @@ public Brush LeftDrawerBackground
214
214
}
215
215
216
216
public static readonly DependencyProperty IsLeftDrawerOpenProperty = DependencyProperty . Register (
217
- nameof ( IsLeftDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsDrawerOpenPropertyChangedCallback ) ) ;
217
+ nameof ( IsLeftDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsLeftDrawerOpenPropertyChangedCallback ) ) ;
218
218
219
219
public bool IsLeftDrawerOpen
220
220
{
@@ -294,7 +294,7 @@ public Brush RightDrawerBackground
294
294
}
295
295
296
296
public static readonly DependencyProperty IsRightDrawerOpenProperty = DependencyProperty . Register (
297
- nameof ( IsRightDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsDrawerOpenPropertyChangedCallback ) ) ;
297
+ nameof ( IsRightDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsRightDrawerOpenPropertyChangedCallback ) ) ;
298
298
299
299
public bool IsRightDrawerOpen
300
300
{
@@ -374,7 +374,7 @@ public Brush BottomDrawerBackground
374
374
}
375
375
376
376
public static readonly DependencyProperty IsBottomDrawerOpenProperty = DependencyProperty . Register (
377
- nameof ( IsBottomDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsDrawerOpenPropertyChangedCallback ) ) ;
377
+ nameof ( IsBottomDrawerOpen ) , typeof ( bool ) , typeof ( DrawerHost ) , new FrameworkPropertyMetadata ( default ( bool ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , IsBottomDrawerOpenPropertyChangedCallback ) ) ;
378
378
379
379
public bool IsBottomDrawerOpen
380
380
{
@@ -406,6 +406,56 @@ public bool BottomDrawerCloseOnClickAway
406
406
407
407
#endregion
408
408
409
+ #region open drawer events/callbacks
410
+
411
+ public static readonly RoutedEvent DrawerOpenedEvent =
412
+ EventManager . RegisterRoutedEvent (
413
+ "DrawerOpened" ,
414
+ RoutingStrategy . Bubble ,
415
+ typeof ( EventHandler < DrawerOpenedEventArgs > ) ,
416
+ typeof ( DrawerHost ) ) ;
417
+
418
+ /// <summary>
419
+ /// Raised when a drawer is opened.
420
+ /// </summary>
421
+ public event EventHandler < DrawerOpenedEventArgs > DrawerOpened
422
+ {
423
+ add { AddHandler ( DrawerOpenedEvent , value ) ; }
424
+ remove { RemoveHandler ( DrawerOpenedEvent , value ) ; }
425
+ }
426
+
427
+ protected void OnDrawerOpened ( DrawerOpenedEventArgs eventArgs )
428
+ {
429
+ RaiseEvent ( eventArgs ) ;
430
+ }
431
+
432
+ #endregion
433
+
434
+ #region close drawer events/callbacks
435
+
436
+ public static readonly RoutedEvent DrawerClosingEvent =
437
+ EventManager . RegisterRoutedEvent (
438
+ "DrawerClosing" ,
439
+ RoutingStrategy . Bubble ,
440
+ typeof ( EventHandler < DrawerClosingEventArgs > ) ,
441
+ typeof ( DrawerHost ) ) ;
442
+
443
+ /// <summary>
444
+ /// Raised when a drawer is closing.
445
+ /// </summary>
446
+ public event EventHandler < DrawerClosingEventArgs > DrawerClosing
447
+ {
448
+ add { AddHandler ( DrawerClosingEvent , value ) ; }
449
+ remove { RemoveHandler ( DrawerClosingEvent , value ) ; }
450
+ }
451
+
452
+ protected void OnDrawerClosing ( DrawerClosingEventArgs eventArgs )
453
+ {
454
+ RaiseEvent ( eventArgs ) ;
455
+ }
456
+
457
+ #endregion
458
+
409
459
public override void OnApplyTemplate ( )
410
460
{
411
461
if ( _templateContentCoverElement != null )
@@ -500,12 +550,45 @@ private void UpdateVisualStates(bool? useTransitions = null)
500
550
IsBottomDrawerOpen ? TemplateBottomOpenStateName : TemplateBottomClosedStateName , useTransitions . HasValue ? useTransitions . Value : ! TransitionAssist . GetDisableTransitions ( this ) ) ;
501
551
}
502
552
503
- private static void IsDrawerOpenPropertyChangedCallback ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs )
553
+ private static void IsTopDrawerOpenPropertyChangedCallback ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs )
554
+ {
555
+ IsDrawerOpenPropertyChanged ( dependencyObject , dependencyPropertyChangedEventArgs , Dock . Top ) ;
556
+ }
557
+
558
+ private static void IsLeftDrawerOpenPropertyChangedCallback ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs )
559
+ {
560
+ IsDrawerOpenPropertyChanged ( dependencyObject , dependencyPropertyChangedEventArgs , Dock . Left ) ;
561
+ }
562
+
563
+ private static void IsRightDrawerOpenPropertyChangedCallback ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs )
564
+ {
565
+ IsDrawerOpenPropertyChanged ( dependencyObject , dependencyPropertyChangedEventArgs , Dock . Right ) ;
566
+ }
567
+
568
+ private static void IsBottomDrawerOpenPropertyChangedCallback ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs )
569
+ {
570
+ IsDrawerOpenPropertyChanged ( dependencyObject , dependencyPropertyChangedEventArgs , Dock . Bottom ) ;
571
+ }
572
+
573
+ private static void IsDrawerOpenPropertyChanged ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs , Dock dock )
504
574
{
505
575
var drawerHost = ( DrawerHost ) dependencyObject ;
506
576
if ( ! drawerHost . _lockZIndexes && ( bool ) dependencyPropertyChangedEventArgs . NewValue )
507
577
drawerHost . PrepareZIndexes ( drawerHost . _zIndexPropertyLookup [ dependencyPropertyChangedEventArgs . Property ] ) ;
508
578
drawerHost . UpdateVisualStates ( ) ;
579
+
580
+ if ( ( bool ) dependencyPropertyChangedEventArgs . NewValue )
581
+ {
582
+ RaiseDrawerOpened ( drawerHost , dock ) ;
583
+ }
584
+ }
585
+
586
+ private static void RaiseDrawerOpened ( DrawerHost drawerHost , Dock dock )
587
+ {
588
+ //multiple ways of calling back that the drawer has opened:
589
+ // * routed event
590
+ var drawerOpenedEventArgs = new DrawerOpenedEventArgs ( dock , DrawerOpenedEvent ) ;
591
+ drawerHost . OnDrawerOpened ( drawerOpenedEventArgs ) ;
509
592
}
510
593
511
594
private void PrepareZIndexes ( DependencyPropertyKey zIndexDependencyPropertyKey )
@@ -524,6 +607,19 @@ private void CloseDrawerHandler(object sender, ExecutedRoutedEventArgs executedR
524
607
{
525
608
if ( executedRoutedEventArgs . Handled ) return ;
526
609
610
+ if ( executedRoutedEventArgs . Parameter is Dock dock )
611
+ {
612
+ var drawerClosingEventArgs = new DrawerClosingEventArgs ( dock , DrawerClosingEvent ) ;
613
+ //multiple ways of calling back that the drawer is closing:
614
+ // * routed event
615
+ OnDrawerClosing ( drawerClosingEventArgs ) ;
616
+
617
+ if ( drawerClosingEventArgs . IsCancelled )
618
+ {
619
+ return ;
620
+ }
621
+ }
622
+
527
623
SetOpenFlag ( executedRoutedEventArgs , false ) ;
528
624
529
625
executedRoutedEventArgs . Handled = true ;
0 commit comments