站长网站提交,私域电商平台排名,上海著名的网站制作公司,闸北区网站设计与制C# WPF实现动画渐入暗黑明亮主题切换效果
效果图如下最近在Bilibili的桌面端看到一个黑白主题切换的效果感觉#xff0c;挺有意思。于是我使用WPF尝试实现该效果。 主要的切换效果#xff0c;基本实现不过还存在一些小瑕疵#xff0c;比如字体等笔刷不能跟随动画进入进行切…C# WPF实现动画渐入暗黑明亮主题切换效果
效果图如下最近在Bilibili的桌面端看到一个黑白主题切换的效果感觉挺有意思。于是我使用WPF尝试实现该效果。 主要的切换效果基本实现不过还存在一些小瑕疵比如字体等笔刷不能跟随动画进入进行切换。因为Bilibili的客户端是用electron写的前端使用的html,css确实太强了这咱只能佩服。
实现思路
在文末已付上代码的地址 UI使用三段式的布局那么第一列和第三列可以使用白色或黑色来进行主题底色的实现。而第二列则使用一个带透明度的灰色进行覆盖底色 切换主题时需要两部分操作一是切换底色二是切换文本等前景色的资源字典。因此我准备了三个资源字典进行主题切换。Main用于存储不变的笔刷资源Light和Dark分别保存在明亮和暗黑两种状态下显示不同的资源。 切换底色如果使用切换字典的方式则无法实现动态效果于是我在底图层下使用一个圆形的绘图并在切换动作时进行简单的缩放动画即可(此处我使用DataTrigger与切换按钮的状态进行绑定在状态改变时触发动画效果) Ellipse Grid.ColumnSpan3 Fill#202020 RenderTransformOrigin0.5,0.5 Margin30 HorizontalAlignmentLeft VerticalAlignmentBottom Width1 Height1Ellipse.RenderTransformTransformGroupScaleTransform x:NameBackEllipseScale//TransformGroup/Ellipse.RenderTransformEllipse.StyleStyle TargetTypeEllipseStyle.TriggersDataTrigger Binding{Binding ElementNameThemeToggle,PathIsChecked} ValueTrueSetter PropertyVisibility ValueVisible/DataTrigger.EnterActionsBeginStoryboardStoryboardDoubleAnimation Duration0:0:0.5 To3500 Storyboard.TargetPropertyRenderTransform.Children[0].ScaleXDoubleAnimation.EasingFunctionCubicEase EasingModeEaseOut//DoubleAnimation.EasingFunction/DoubleAnimationDoubleAnimation Duration0:0:0.5 To3500 Storyboard.TargetPropertyRenderTransform.Children[0].ScaleYDoubleAnimation.EasingFunctionCubicEase EasingModeEaseOut//DoubleAnimation.EasingFunction/DoubleAnimation/Storyboard/BeginStoryboard/DataTrigger.EnterActionsDataTrigger.ExitActionsBeginStoryboardStoryboardDoubleAnimation Duration0:0:0.5 To0 Storyboard.TargetPropertyRenderTransform.Children[0].ScaleXDoubleAnimation.EasingFunctionCubicEase EasingModeEaseOut//DoubleAnimation.EasingFunction/DoubleAnimationDoubleAnimation Duration0:0:0.5 To0 Storyboard.TargetPropertyRenderTransform.Children[0].ScaleYDoubleAnimation.EasingFunctionCubicEase EasingModeEaseOut//DoubleAnimation.EasingFunction/DoubleAnimation/Storyboard/BeginStoryboard/DataTrigger.ExitActions/DataTrigger/Style.Triggers/Style/Ellipse.Style/Ellipse切换前景色这个就比较简单了使用基础的更改资源字典即可。当前使用的资源都需要是 DynamicResource private void ThemeToggle_Checked(object sender, RoutedEventArgs e){SwitchTheme(true);}private void ThemeToggle_Unchecked(object sender, RoutedEventArgs e){SwitchTheme(false);}
public void SwitchTheme(bool isDark){var res Application.Current.Resources.MergedDictionaries;ResourceDictionary dictionary new ResourceDictionary();dictionary.Source new Uri(isDark ? ./Dark.xaml : ./Light.xaml, UriKind.Relative);res[1] dictionary;}项目地址github