memory optimization

This commit is contained in:
NaBian committed 2021-06-10 00:40:13 +08:00
1 parent 5afb569d11
commit 1ec8cb521c
5 files changed
+92 -36

No files matched your search

@@ -8,7 +8,7 @@ namespace HandyControlDemo.Properties.Langs
{
public class LangProvider : INotifyPropertyChanged
{
internal static LangProvider Instance => ResourceHelper.GetResource<LangProvider>("DemoLangs");
internal static LangProvider Instance { get; } = ResourceHelper.GetResource<LangProvider>("DemoLangs");
private static string CultureInfoStr;
@@ -11,10 +11,14 @@ namespace HandyControl.Controls
{
private FrameworkElement _contentPresenter;
private static Storyboard StoryboardBuildInDefault;
private Storyboard _storyboardBuildIn;
public TransitioningContentControl()
{
Loaded += TransitioningContentControl_Loaded;
IsVisibleChanged += TransitioningContentControl_IsVisibleChanged;
Unloaded += TransitioningContentControl_Unloaded;
}
public static readonly DependencyProperty TransitionModeProperty = DependencyProperty.Register(
@@ -23,7 +27,13 @@ namespace HandyControl.Controls
private static void OnTransitionModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var ctl = (TransitioningContentControl) d;
ctl.StartTransition();
ctl.OnTransitionModeChanged((TransitionMode) e.NewValue);
}
private void OnTransitionModeChanged(TransitionMode newValue)
{
_storyboardBuildIn = ResourceHelper.GetResourceInternal<Storyboard>($"{newValue}Transition");
StartTransition();
}
public TransitionMode TransitionMode
@@ -43,19 +53,33 @@ namespace HandyControl.Controls
private void TransitioningContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) => StartTransition();
private void TransitioningContentControl_Loaded(object sender, RoutedEventArgs e) => StartTransition();
private void TransitioningContentControl_Loaded(object sender, RoutedEventArgs e)
{
StartTransition();
IsVisibleChanged += TransitioningContentControl_IsVisibleChanged;
}
private void TransitioningContentControl_Unloaded(object sender, RoutedEventArgs e)
{
IsVisibleChanged -= TransitioningContentControl_IsVisibleChanged;
}
private void StartTransition()
{
if (Visibility != Visibility.Visible || _contentPresenter == null) return;
if (!IsArrangeValid || _contentPresenter == null) return;
if (TransitionStoryboard != null)
{
TransitionStoryboard.Begin(_contentPresenter);
}
else if (Application.Current != null)
else if (_storyboardBuildIn != null)
{
ResourceHelper.GetResourceInternal<Storyboard>($"{TransitionMode.ToString()}Transition")?.Begin(_contentPresenter);
_storyboardBuildIn?.Begin(_contentPresenter);
}
else
{
StoryboardBuildInDefault ??= ResourceHelper.GetResourceInternal<Storyboard>($"{default(TransitionMode)}Transition");
StoryboardBuildInDefault?.Begin(_contentPresenter);
}
}
@@ -8,7 +8,7 @@ namespace HandyControl.Properties.Langs
{
public class LangProvider : INotifyPropertyChanged
{
internal static LangProvider Instance => ResourceHelper.GetResourceInternal<LangProvider>("Langs");
internal static LangProvider Instance { get; } = ResourceHelper.GetResourceInternal<LangProvider>("Langs");
private static string CultureInfoStr;
@@ -79,13 +79,20 @@ namespace HandyControl.Tools
Source = new Uri($"pack://application:,,,/HandyControl;component/Themes/Skin{skin}.xaml")
};
private static ResourceDictionary HcTheme;
/// <summary>
/// get HandyControl theme
/// </summary>
/// <returns></returns>
public static ResourceDictionary GetTheme() => new Lazy<ResourceDictionary>(() => new ResourceDictionary
public static ResourceDictionary GetTheme()
{
Source = new Uri("pack://application:,,,/HandyControl;component/Themes/Theme.xaml")
}).Value;
HcTheme ??= new ResourceDictionary
{
Source = new Uri("pack://application:,,,/HandyControl;component/Themes/Theme.xaml")
};
return HcTheme;
}
}
}
@@ -1,4 +1,5 @@
using System.Windows;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using HandyControl.Controls;
@@ -8,6 +9,30 @@ namespace HandyControl.Tools
{
public class ButtonGroupItemStyleSelector : StyleSelector
{
private static readonly Dictionary<string, Style> StyleDict = new()
{
[ResourceToken.RadioGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemSingle),
[ResourceToken.RadioGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalFirst),
[ResourceToken.RadioGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalLast),
[ResourceToken.RadioGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalFirst),
[ResourceToken.RadioGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalLast),
[ResourceToken.RadioGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemDefault),
[ResourceToken.ButtonGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemSingle),
[ResourceToken.ButtonGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalFirst),
[ResourceToken.ButtonGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalLast),
[ResourceToken.ButtonGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalFirst),
[ResourceToken.ButtonGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalLast),
[ResourceToken.ButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemDefault),
[ResourceToken.ToggleButtonGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemSingle),
[ResourceToken.ToggleButtonGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalFirst),
[ResourceToken.ToggleButtonGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalLast),
[ResourceToken.ToggleButtonGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalFirst),
[ResourceToken.ToggleButtonGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalLast),
[ResourceToken.ToggleButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemDefault)
};
public override Style SelectStyle(object item, DependencyObject container)
{
if (container is ButtonGroup buttonGroup && item is ButtonBase buttonBase)
@@ -16,67 +41,67 @@ namespace HandyControl.Tools
switch (buttonBase)
{
case RadioButton _:
case RadioButton:
{
if (count == 1)
{
return ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemSingle);
return StyleDict[ResourceToken.RadioGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonBase);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalFirst)
: ResourceHelper.GetResourceInternal<Style>(index == count - 1
? StyleDict[ResourceToken.RadioGroupItemHorizontalFirst]
: StyleDict[index == count - 1
? ResourceToken.RadioGroupItemHorizontalLast
: ResourceToken.RadioGroupItemDefault)
: ResourceToken.RadioGroupItemDefault]
: index == 0
? ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalFirst)
: ResourceHelper.GetResourceInternal<Style>(index == count - 1
? StyleDict[ResourceToken.RadioGroupItemVerticalFirst]
: StyleDict[index == count - 1
? ResourceToken.RadioGroupItemVerticalLast
: ResourceToken.RadioGroupItemDefault);
: ResourceToken.RadioGroupItemDefault];
}
case Button _:
case Button:
{
if (count == 1)
{
return ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemSingle);
return StyleDict[ResourceToken.ButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonBase);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalFirst)
: ResourceHelper.GetResourceInternal<Style>(index == count - 1
? StyleDict[ResourceToken.ButtonGroupItemHorizontalFirst]
: StyleDict[index == count - 1
? ResourceToken.ButtonGroupItemHorizontalLast
: ResourceToken.ButtonGroupItemDefault)
: ResourceToken.ButtonGroupItemDefault]
: index == 0
? ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalFirst)
: ResourceHelper.GetResourceInternal<Style>(index == count - 1
? StyleDict[ResourceToken.ButtonGroupItemVerticalFirst]
: StyleDict[index == count - 1
? ResourceToken.ButtonGroupItemVerticalLast
: ResourceToken.ButtonGroupItemDefault);
: ResourceToken.ButtonGroupItemDefault];
}
case ToggleButton _:
case ToggleButton:
{
if (count == 1)
{
return ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemSingle);
return StyleDict[ResourceToken.ToggleButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonBase);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalFirst)
: ResourceHelper.GetResourceInternal<Style>(index == count - 1
? StyleDict[ResourceToken.ToggleButtonGroupItemHorizontalFirst]
: StyleDict[index == count - 1
? ResourceToken.ToggleButtonGroupItemHorizontalLast
: ResourceToken.ToggleButtonGroupItemDefault)
: ResourceToken.ToggleButtonGroupItemDefault]
: index == 0
? ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalFirst)
: ResourceHelper.GetResourceInternal<Style>(index == count - 1
? StyleDict[ResourceToken.ToggleButtonGroupItemVerticalFirst]
: StyleDict[index == count - 1
? ResourceToken.ToggleButtonGroupItemVerticalLast
: ResourceToken.ToggleButtonGroupItemDefault);
: ResourceToken.ToggleButtonGroupItemDefault];
}
}
}