Skip to content

Commit 243f368

Browse files
committed
Add DeferredContent class to improve startup performance
1 parent 9b0f2a5 commit 243f368

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using System.Windows;
3+
using System.Windows.Controls;
4+
5+
namespace IPConfig.Controls;
6+
7+
/// <summary>
8+
/// <see href="https://stackoverflow.com/a/26543731/4380178">Deferred loading of XAML</see>
9+
/// </summary>
10+
public class DeferredContent : ContentPresenter
11+
{
12+
public static readonly DependencyProperty DeferredContentTemplateProperty =
13+
DependencyProperty.Register("DeferredContentTemplate",
14+
typeof(DataTemplate), typeof(DeferredContent), null);
15+
16+
public DataTemplate DeferredContentTemplate
17+
{
18+
get => (DataTemplate)GetValue(DeferredContentTemplateProperty);
19+
set => SetValue(DeferredContentTemplateProperty, value);
20+
}
21+
22+
public event EventHandler<RoutedEventArgs>? DeferredContentLoaded;
23+
24+
public DeferredContent()
25+
{
26+
Loaded += HandleLoaded;
27+
}
28+
29+
public void ShowDeferredContent()
30+
{
31+
if (DeferredContentTemplate is not null)
32+
{
33+
Content = DeferredContentTemplate.LoadContent();
34+
RaiseDeferredContentLoaded();
35+
}
36+
}
37+
38+
private void HandleLoaded(object sender, RoutedEventArgs e)
39+
{
40+
Loaded -= HandleLoaded;
41+
Dispatcher.BeginInvoke(ShowDeferredContent);
42+
}
43+
44+
private void RaiseDeferredContentLoaded()
45+
{
46+
DeferredContentLoaded?.Invoke(this, new RoutedEventArgs());
47+
}
48+
}

IPConfig/Views/MainWindow.xaml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
xmlns:hcd="clr-namespace:HandyControl.Data;assembly=HandyControl"
88
xmlns:app="clr-namespace:IPConfig"
99
xmlns:b="clr-namespace:IPConfig.Behaviors"
10+
xmlns:c="clr-namespace:IPConfig.Controls"
1011
xmlns:conv="clr-namespace:IPConfig.Converters"
1112
xmlns:lang="clr-namespace:IPConfig.Languages"
1213
xmlns:m="clr-namespace:IPConfig.Models"
@@ -408,9 +409,15 @@
408409
</hc:ToggleBlock.UnCheckedContent>
409410

410411
<hc:ToggleBlock.CheckedContent>
411-
<hc:TransitioningContentControl TransitionMode="Right2Left">
412-
<v:NicConfigDetailView />
413-
</hc:TransitioningContentControl>
412+
<c:DeferredContent>
413+
<c:DeferredContent.DeferredContentTemplate>
414+
<DataTemplate>
415+
<hc:TransitioningContentControl TransitionMode="Right2Left">
416+
<v:NicConfigDetailView />
417+
</hc:TransitioningContentControl>
418+
</DataTemplate>
419+
</c:DeferredContent.DeferredContentTemplate>
420+
</c:DeferredContent>
414421
</hc:ToggleBlock.CheckedContent>
415422
</hc:ToggleBlock>
416423
</Grid>

0 commit comments

Comments
 (0)