Skip to content

Commit 1038895

Browse files
committed
top bottom drawers...animations a bit choppy :(
1 parent d304968 commit 1038895

File tree

3 files changed

+297
-36
lines changed

3 files changed

+297
-36
lines changed

MainDemo.Wpf/ProvingGround.xaml

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,34 @@
2929
</UserControl.Resources>
3030

3131
<materialDesign:DrawerHost>
32-
<materialDesign:DrawerHost.RightDrawerContent>
33-
<Grid Margin="16">
34-
<TextBlock> Hello World</TextBlock>
35-
<Button Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}">
36-
Close
37-
</Button>
38-
</Grid>
39-
</materialDesign:DrawerHost.RightDrawerContent>
32+
<!--
4033
<materialDesign:DrawerHost.LeftDrawerContent>
41-
<Grid Margin="16">
34+
<StackPanel Margin="16">
4235
<TextBlock>LEFT STUFF</TextBlock>
4336
<Button Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}">
4437
Close
4538
</Button>
46-
</Grid>
39+
</StackPanel>
4740
</materialDesign:DrawerHost.LeftDrawerContent>
41+
-->
42+
<materialDesign:DrawerHost.TopDrawerContent>
43+
<StackPanel Margin="16" HorizontalAlignment="Center">
44+
<TextBlock>TOP STUFF</TextBlock>
45+
<Button Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}">
46+
Close
47+
</Button>
48+
</StackPanel>
49+
</materialDesign:DrawerHost.TopDrawerContent>
50+
<!--
51+
<materialDesign:DrawerHost.RightDrawerContent>
52+
<StackPanel Margin="16">
53+
<TextBlock> Hello World</TextBlock>
54+
<Button Command="{x:Static materialDesign:DrawerHost.CloseDrawerCommand}">
55+
Close
56+
</Button>
57+
</StackPanel>
58+
</materialDesign:DrawerHost.RightDrawerContent>
59+
-->
4860
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
4961
<Button Command="{x:Static materialDesign:DrawerHost.OpenDrawerCommand}">
5062
Open sesame

MaterialDesignThemes.Wpf/DrawerHost.cs

Lines changed: 134 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ namespace MaterialDesignThemes.Wpf
1111
[TemplateVisualState(GroupName = TemplateAllDrawersGroupName, Name = TemplateAllDrawersAnyOpenStateName)]
1212
[TemplateVisualState(GroupName = TemplateLeftDrawerGroupName, Name = TemplateLeftClosedStateName)]
1313
[TemplateVisualState(GroupName = TemplateLeftDrawerGroupName, Name = TemplateLeftOpenStateName)]
14+
[TemplateVisualState(GroupName = TemplateTopDrawerGroupName, Name = TemplateTopClosedStateName)]
15+
[TemplateVisualState(GroupName = TemplateTopDrawerGroupName, Name = TemplateTopOpenStateName)]
1416
[TemplateVisualState(GroupName = TemplateRightDrawerGroupName, Name = TemplateRightClosedStateName)]
1517
[TemplateVisualState(GroupName = TemplateRightDrawerGroupName, Name = TemplateRightOpenStateName)]
18+
[TemplateVisualState(GroupName = TemplateBottomDrawerGroupName, Name = TemplateBottomClosedStateName)]
19+
[TemplateVisualState(GroupName = TemplateBottomDrawerGroupName, Name = TemplateBottomOpenStateName)]
1620
[TemplatePart(Name = TemplateContentCoverPartName, Type = typeof(FrameworkElement))]
1721
public class DrawerHost : ContentControl
1822
{
@@ -22,9 +26,15 @@ public class DrawerHost : ContentControl
2226
public const string TemplateLeftDrawerGroupName = "LeftDrawer";
2327
public const string TemplateLeftClosedStateName = "LeftDrawerClosed";
2428
public const string TemplateLeftOpenStateName = "LeftDrawerOpen";
29+
public const string TemplateTopDrawerGroupName = "TopDrawer";
30+
public const string TemplateTopClosedStateName = "TopDrawerClosed";
31+
public const string TemplateTopOpenStateName = "TopDrawerOpen";
2532
public const string TemplateRightDrawerGroupName = "RightDrawer";
2633
public const string TemplateRightClosedStateName = "RightDrawerClosed";
2734
public const string TemplateRightOpenStateName = "RightDrawerOpen";
35+
public const string TemplateBottomDrawerGroupName = "BottomDrawer";
36+
public const string TemplateBottomClosedStateName = "BottomDrawerClosed";
37+
public const string TemplateBottomOpenStateName = "BottomDrawerOpen";
2838

2939
public const string TemplateContentCoverPartName = "PART_ContentCover";
3040

@@ -44,6 +54,60 @@ public DrawerHost()
4454
CommandBindings.Add(new CommandBinding(CloseDrawerCommand, CloseDrawerHandler));
4555
}
4656

57+
public static readonly DependencyProperty TopDrawerContentProperty = DependencyProperty.Register(
58+
nameof(TopDrawerContent), typeof(object), typeof(DrawerHost), new PropertyMetadata(default(object)));
59+
60+
public object TopDrawerContent
61+
{
62+
get { return (object)GetValue(TopDrawerContentProperty); }
63+
set { SetValue(TopDrawerContentProperty, value); }
64+
}
65+
66+
public static readonly DependencyProperty TopDrawerContentTemplateProperty = DependencyProperty.Register(
67+
nameof(TopDrawerContentTemplate), typeof(DataTemplate), typeof(DrawerHost), new PropertyMetadata(default(DataTemplate)));
68+
69+
public DataTemplate TopDrawerContentTemplate
70+
{
71+
get { return (DataTemplate)GetValue(TopDrawerContentTemplateProperty); }
72+
set { SetValue(TopDrawerContentTemplateProperty, value); }
73+
}
74+
75+
public static readonly DependencyProperty TopDrawerContentTemplateSelectorProperty = DependencyProperty.Register(
76+
nameof(TopDrawerContentTemplateSelector), typeof(DataTemplateSelector), typeof(DrawerHost), new PropertyMetadata(default(DataTemplateSelector)));
77+
78+
public DataTemplateSelector TopDrawerContentTemplateSelector
79+
{
80+
get { return (DataTemplateSelector)GetValue(TopDrawerContentTemplateSelectorProperty); }
81+
set { SetValue(TopDrawerContentTemplateSelectorProperty, value); }
82+
}
83+
84+
public static readonly DependencyProperty TopDrawerContentStringFormatProperty = DependencyProperty.Register(
85+
nameof(TopDrawerContentStringFormat), typeof(string), typeof(DrawerHost), new PropertyMetadata(default(string)));
86+
87+
public string TopDrawerContentStringFormat
88+
{
89+
get { return (string)GetValue(TopDrawerContentStringFormatProperty); }
90+
set { SetValue(TopDrawerContentStringFormatProperty, value); }
91+
}
92+
93+
public static readonly DependencyProperty TopDrawerBackgroundProperty = DependencyProperty.Register(
94+
nameof(TopDrawerBackground), typeof(Brush), typeof(DrawerHost), new PropertyMetadata(default(Brush)));
95+
96+
public Brush TopDrawerBackground
97+
{
98+
get { return (Brush)GetValue(TopDrawerBackgroundProperty); }
99+
set { SetValue(TopDrawerBackgroundProperty, value); }
100+
}
101+
102+
public static readonly DependencyProperty IsTopDrawerOpenProperty = DependencyProperty.Register(
103+
nameof(IsTopDrawerOpen), typeof(bool), typeof(DrawerHost), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsDrawerOpenPropertyChangedCallback));
104+
105+
public bool IsTopDrawerOpen
106+
{
107+
get { return (bool)GetValue(IsTopDrawerOpenProperty); }
108+
set { SetValue(IsTopDrawerOpenProperty, value); }
109+
}
110+
47111
public static readonly DependencyProperty LeftDrawerContentProperty = DependencyProperty.Register(
48112
nameof(LeftDrawerContent), typeof (object), typeof (DrawerHost), new PropertyMetadata(default(object)));
49113

@@ -90,7 +154,7 @@ public Brush LeftDrawerBackground
90154
}
91155

92156
public static readonly DependencyProperty IsLeftDrawerOpenProperty = DependencyProperty.Register(
93-
nameof(IsLeftDrawerOpen), typeof (bool), typeof (DrawerHost), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsLeftDrawerOpenPropertyChangedCallback));
157+
nameof(IsLeftDrawerOpen), typeof (bool), typeof (DrawerHost), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsDrawerOpenPropertyChangedCallback));
94158

95159
public bool IsLeftDrawerOpen
96160
{
@@ -144,14 +208,68 @@ public Brush RightDrawerBackground
144208
}
145209

146210
public static readonly DependencyProperty IsRightDrawerOpenProperty = DependencyProperty.Register(
147-
nameof(IsRightDrawerOpen), typeof(bool), typeof(DrawerHost), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsRightDrawerOpenPropertyChangedCallback));
211+
nameof(IsRightDrawerOpen), typeof(bool), typeof(DrawerHost), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsDrawerOpenPropertyChangedCallback));
148212

149213
public bool IsRightDrawerOpen
150214
{
151215
get { return (bool)GetValue(IsRightDrawerOpenProperty); }
152216
set { SetValue(IsRightDrawerOpenProperty, value); }
153217
}
154218

219+
public static readonly DependencyProperty BottomDrawerContentProperty = DependencyProperty.Register(
220+
nameof(BottomDrawerContent), typeof(object), typeof(DrawerHost), new PropertyMetadata(default(object)));
221+
222+
public object BottomDrawerContent
223+
{
224+
get { return (object)GetValue(BottomDrawerContentProperty); }
225+
set { SetValue(BottomDrawerContentProperty, value); }
226+
}
227+
228+
public static readonly DependencyProperty BottomDrawerContentTemplateProperty = DependencyProperty.Register(
229+
nameof(BottomDrawerContentTemplate), typeof(DataTemplate), typeof(DrawerHost), new PropertyMetadata(default(DataTemplate)));
230+
231+
public DataTemplate BottomDrawerContentTemplate
232+
{
233+
get { return (DataTemplate)GetValue(BottomDrawerContentTemplateProperty); }
234+
set { SetValue(BottomDrawerContentTemplateProperty, value); }
235+
}
236+
237+
public static readonly DependencyProperty BottomDrawerContentTemplateSelectorProperty = DependencyProperty.Register(
238+
nameof(BottomDrawerContentTemplateSelector), typeof(DataTemplateSelector), typeof(DrawerHost), new PropertyMetadata(default(DataTemplateSelector)));
239+
240+
public DataTemplateSelector BottomDrawerContentTemplateSelector
241+
{
242+
get { return (DataTemplateSelector)GetValue(BottomDrawerContentTemplateSelectorProperty); }
243+
set { SetValue(BottomDrawerContentTemplateSelectorProperty, value); }
244+
}
245+
246+
public static readonly DependencyProperty BottomDrawerContentStringFormatProperty = DependencyProperty.Register(
247+
nameof(BottomDrawerContentStringFormat), typeof(string), typeof(DrawerHost), new PropertyMetadata(default(string)));
248+
249+
public string BottomDrawerContentStringFormat
250+
{
251+
get { return (string)GetValue(BottomDrawerContentStringFormatProperty); }
252+
set { SetValue(BottomDrawerContentStringFormatProperty, value); }
253+
}
254+
255+
public static readonly DependencyProperty BottomDrawerBackgroundProperty = DependencyProperty.Register(
256+
nameof(BottomDrawerBackground), typeof(Brush), typeof(DrawerHost), new PropertyMetadata(default(Brush)));
257+
258+
public Brush BottomDrawerBackground
259+
{
260+
get { return (Brush)GetValue(BottomDrawerBackgroundProperty); }
261+
set { SetValue(BottomDrawerBackgroundProperty, value); }
262+
}
263+
264+
public static readonly DependencyProperty IsBottomDrawerOpenProperty = DependencyProperty.Register(
265+
nameof(IsBottomDrawerOpen), typeof(bool), typeof(DrawerHost), new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsDrawerOpenPropertyChangedCallback));
266+
267+
public bool IsBottomDrawerOpen
268+
{
269+
get { return (bool)GetValue(IsBottomDrawerOpenProperty); }
270+
set { SetValue(IsBottomDrawerOpenProperty, value); }
271+
}
272+
155273
public override void OnApplyTemplate()
156274
{
157275
if (_templateContentCoverElement != null)
@@ -170,30 +288,33 @@ private void TemplateContentCoverElementOnPreviewMouseLeftButtonUp(object sender
170288
{
171289
SetCurrentValue(IsLeftDrawerOpenProperty, false);
172290
SetCurrentValue(IsRightDrawerOpenProperty, false);
291+
SetCurrentValue(IsTopDrawerOpenProperty, false);
292+
SetCurrentValue(IsBottomDrawerOpenProperty, false);
173293
}
174294

175295
private void UpdateVisualStates(bool? useTransitions = null)
176296
{
177-
var anyOpen = IsLeftDrawerOpen || IsRightDrawerOpen;
297+
var anyOpen = IsTopDrawerOpen || IsLeftDrawerOpen || IsBottomDrawerOpen || IsRightDrawerOpen;
178298

179299
VisualStateManager.GoToState(this,
180300
!anyOpen ? TemplateAllDrawersAllClosedStateName : TemplateAllDrawersAnyOpenStateName, useTransitions.HasValue ? useTransitions.Value : !TransitionAssist.GetDisableTransitions(this));
181301

182302
VisualStateManager.GoToState(this,
183303
IsLeftDrawerOpen ? TemplateLeftOpenStateName : TemplateLeftClosedStateName, useTransitions.HasValue ? useTransitions.Value : !TransitionAssist.GetDisableTransitions(this));
184304

305+
VisualStateManager.GoToState(this,
306+
IsTopDrawerOpen ? TemplateTopOpenStateName : TemplateTopClosedStateName, useTransitions.HasValue ? useTransitions.Value : !TransitionAssist.GetDisableTransitions(this));
307+
185308
VisualStateManager.GoToState(this,
186309
IsRightDrawerOpen ? TemplateRightOpenStateName : TemplateRightClosedStateName, useTransitions.HasValue ? useTransitions.Value : !TransitionAssist.GetDisableTransitions(this));
187-
}
188310

189-
private static void IsLeftDrawerOpenPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
190-
{
191-
((DrawerHost)dependencyObject).UpdateVisualStates();
311+
VisualStateManager.GoToState(this,
312+
IsBottomDrawerOpen ? TemplateBottomOpenStateName : TemplateBottomClosedStateName, useTransitions.HasValue ? useTransitions.Value : !TransitionAssist.GetDisableTransitions(this));
192313
}
193314

194-
private static void IsRightDrawerOpenPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
315+
private static void IsDrawerOpenPropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
195316
{
196-
((DrawerHost)dependencyObject).UpdateVisualStates();
317+
((DrawerHost)dependencyObject).UpdateVisualStates();
197318
}
198319

199320
private void CloseDrawerHandler(object sender, ExecutedRoutedEventArgs executedRoutedEventArgs)
@@ -224,11 +345,13 @@ private void SetOpenFlag(ExecutedRoutedEventArgs executedRoutedEventArgs, bool v
224345
SetCurrentValue(IsLeftDrawerOpenProperty, value);
225346
break;
226347
case Dock.Top:
348+
SetCurrentValue(IsTopDrawerOpenProperty, value);
227349
break;
228350
case Dock.Right:
229351
SetCurrentValue(IsRightDrawerOpenProperty, value);
230352
break;
231353
case Dock.Bottom:
354+
SetCurrentValue(IsBottomDrawerOpenProperty, value);
232355
break;
233356
default:
234357
throw new ArgumentOutOfRangeException();
@@ -237,7 +360,9 @@ private void SetOpenFlag(ExecutedRoutedEventArgs executedRoutedEventArgs, bool v
237360
else
238361
{
239362
SetCurrentValue(IsLeftDrawerOpenProperty, value);
363+
SetCurrentValue(IsTopDrawerOpenProperty, value);
240364
SetCurrentValue(IsRightDrawerOpenProperty, value);
365+
SetCurrentValue(IsBottomDrawerOpenProperty, value);
241366
}
242367
}
243368
}

0 commit comments

Comments
 (0)