WPF实现窗体亚克力效果的示例代码

 更新时间:2022年10月04日 07:34:25   作者:驚鏵  
这篇文章主要为大家详细介绍了如何利用WPF实现窗体亚克力效果,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

WPF 窗体设置亚克力效果

框架使用大于等于.NET40

Visual Studio 2022

项目使用 MIT 开源许可协议。

WindowAcrylicBlur 设置亚克力颜色。

Opacity 设置透明度。

实现代码

1) 准备WindowAcrylicBlur.cs如下:

using?System;
using?System.Runtime.InteropServices;
using?System.Windows;
using?System.Windows.Interop;
using?System.Windows.Media;
using?Microsoft.Win32;
using?Microsoft.Windows.Shell;

namespace?WPFDevelopers.Controls
{
????internal?enum?AccentState
????{
????????ACCENT_DISABLED?=?0,
????????ACCENT_ENABLE_GRADIENT?=?1,
????????ACCENT_ENABLE_TRANSPARENTGRADIENT?=?2,
????????ACCENT_ENABLE_BLURBEHIND?=?3,
????????ACCENT_ENABLE_ACRYLICBLURBEHIND?=?4,
????????ACCENT_INVALID_STATE?=?5
????}

????[StructLayout(LayoutKind.Sequential)]
????internal?struct?AccentPolicy
????{
????????public?AccentState?AccentState;
????????public?uint?AccentFlags;
????????public?uint?GradientColor;
????????public?uint?AnimationId;
????}

????[StructLayout(LayoutKind.Sequential)]
????internal?struct?WindowCompositionAttributeData
????{
????????public?WindowCompositionAttribute?Attribute;
????????public?IntPtr?Data;
????????public?int?SizeOfData;
????}

????internal?enum?WindowCompositionAttribute
????{
????????//?...
????????WCA_ACCENT_POLICY?=?19
????????//?...
????}

????internal?class?WindowOldConfig
????{
????????public?bool?AllowsTransparency;
????????public?Brush?Background;
????????public?WindowChrome?WindowChrome;
????????public?WindowStyle?WindowStyle?=?WindowStyle.SingleBorderWindow;
????}


????internal?class?WindowOSHelper
????{
????????public?static?Version?GetWindowOSVersion()
????????{
????????????var?regKey?=?Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows?NT\CurrentVersion");

????????????int?major;
????????????int?minor;
????????????int?build;
????????????int?revision;
????????????try
????????????{
????????????????var?str?=?regKey.GetValue("CurrentMajorVersionNumber")?.ToString();
????????????????int.TryParse(str,?out?major);

????????????????str?=?regKey.GetValue("CurrentMinorVersionNumber")?.ToString();
????????????????int.TryParse(str,?out?minor);

????????????????str?=?regKey.GetValue("CurrentBuildNumber")?.ToString();
????????????????int.TryParse(str,?out?build);

????????????????str?=?regKey.GetValue("BaseBuildRevisionNumber")?.ToString();
????????????????int.TryParse(str,?out?revision);

????????????????return?new?Version(major,?minor,?build,?revision);
????????????}
????????????catch?(Exception)
????????????{
????????????????return?new?Version(0,?0,?0,?0);
????????????}
????????????finally
????????????{
????????????????regKey.Close();
????????????}
????????}
????}


????public?class?WindowAcrylicBlur?:?Freezable
????{
????????private?static?readonly?Color?_BackgtoundColor?=?Color.FromArgb(0x01,?0,?0,?0);?//设置透明色?防止穿透

????????[DllImport("user32.dll")]
????????internal?static?extern?int?SetWindowCompositionAttribute(IntPtr?hwnd,?ref?WindowCompositionAttributeData?data);

????????private?static?bool?EnableAcrylicBlur(Window?window,?Color?color,?double?opacity,?bool?enable)
????????{
????????????if?(window?==?null)
????????????????return?false;

????????????AccentState?accentState;
????????????var?vOsVersion?=?WindowOSHelper.GetWindowOSVersion();
????????????if?(vOsVersion?>?new?Version(10,?0,?17763))?//1809
????????????????accentState?=?enable???AccentState.ACCENT_ENABLE_ACRYLICBLURBEHIND?:?AccentState.ACCENT_DISABLED;
????????????else?if?(vOsVersion?>?new?Version(10,?0))
????????????????accentState?=?enable???AccentState.ACCENT_ENABLE_BLURBEHIND?:?AccentState.ACCENT_DISABLED;
????????????else
????????????????accentState?=?AccentState.ACCENT_DISABLED;

????????????if?(opacity?>?1)
????????????????opacity?=?1;

????????????var?windowHelper?=?new?WindowInteropHelper(window);

????????????var?accent?=?new?AccentPolicy();

????????????var?opacityIn?=?(uint)?(255?*?opacity);

????????????accent.AccentState?=?accentState;

????????????if?(enable)
????????????{
????????????????var?blurColor?=?(uint)?((color.R?<<?0)?|?(color.G?<<?8)?|?(color.B?<<?16)?|?(color.A?<<?24));
????????????????var?blurColorIn?=?blurColor;
????????????????if?(opacityIn?>?0)
????????????????????blurColorIn?=?(opacityIn?<<?24)?|?(blurColor?&?0xFFFFFF);
????????????????else?if?(opacityIn?==?0?&&?color.A?==?0)
????????????????????blurColorIn?=?(0x01?<<?24)?|?(blurColor?&?0xFFFFFF);

????????????????if?(accent.GradientColor?==?blurColorIn)
????????????????????return?true;

????????????????accent.GradientColor?=?blurColorIn;
????????????}

????????????var?accentStructSize?=?Marshal.SizeOf(accent);

????????????var?accentPtr?=?Marshal.AllocHGlobal(accentStructSize);
????????????Marshal.StructureToPtr(accent,?accentPtr,?false);

????????????var?data?=?new?WindowCompositionAttributeData();
????????????data.Attribute?=?WindowCompositionAttribute.WCA_ACCENT_POLICY;
????????????data.SizeOfData?=?accentStructSize;
????????????data.Data?=?accentPtr;

????????????SetWindowCompositionAttribute(windowHelper.Handle,?ref?data);

????????????Marshal.FreeHGlobal(accentPtr);

????????????return?true;
????????}

????????private?static?void?Window_Initialized(object?sender,?EventArgs?e)
????????{
????????????if?(!(sender?is?Window?window))
????????????????return;

????????????var?config?=?new?WindowOldConfig
????????????{
????????????????WindowStyle?=?window.WindowStyle,
????????????????AllowsTransparency?=?window.AllowsTransparency,
????????????????Background?=?window.Background
????????????};

????????????var?vWindowChrome?=?WindowChrome.GetWindowChrome(window);
????????????if?(vWindowChrome?==?null)
????????????{
????????????????window.WindowStyle?=?WindowStyle.None;?//一定要将窗口的背景色改为透明才行
????????????????window.AllowsTransparency?=?true;?//一定要将窗口的背景色改为透明才行
????????????????window.Background?=?new?SolidColorBrush(_BackgtoundColor);?//一定要将窗口的背景色改为透明才行
????????????}
????????????else
????????????{
????????????????config.WindowChrome?=?new?WindowChrome
????????????????{
????????????????????GlassFrameThickness?=?vWindowChrome.GlassFrameThickness
????????????????};
????????????????window.Background?=?Brushes.Transparent;?//一定要将窗口的背景色改为透明才行
????????????????var?vGlassFrameThickness?=?vWindowChrome.GlassFrameThickness;
????????????????vWindowChrome.GlassFrameThickness?=?new?Thickness(0,?vGlassFrameThickness.Top,?0,?0);
????????????}

????????????SetWindowOldConfig(window,?config);

????????????window.Initialized?-=?Window_Initialized;
????????}

????????private?static?void?Window_Loaded(object?sender,?RoutedEventArgs?e)
????????{
????????????if?(!(sender?is?Window?window))
????????????????return;

????????????var?vBlur?=?GetWindowAcrylicBlur(window);
????????????if?(vBlur?!=?null)
????????????????EnableAcrylicBlur(window,?vBlur.BlurColor,?vBlur.Opacity,?true);

????????????window.Loaded?-=?Window_Loaded;
????????}


????????protected?override?Freezable?CreateInstanceCore()
????????{
????????????throw?new?NotImplementedException();
????????}

????????protected?override?void?OnChanged()
????????{
????????????base.OnChanged();
????????}

????????protected?override?void?OnPropertyChanged(DependencyPropertyChangedEventArgs?e)
????????{
????????????base.OnPropertyChanged(e);
????????}

????????#region?开启Win11风格

????????public?static?WindowAcrylicBlur?GetWindowAcrylicBlur(DependencyObject?obj)
????????{
????????????return?(WindowAcrylicBlur)?obj.GetValue(WindowAcrylicBlurProperty);
????????}

????????public?static?void?SetWindowAcrylicBlur(DependencyObject?obj,?WindowAcrylicBlur?value)
????????{
????????????obj.SetValue(WindowAcrylicBlurProperty,?value);
????????}

????????public?static?readonly?DependencyProperty?WindowAcrylicBlurProperty?=
????????????DependencyProperty.RegisterAttached("WindowAcrylicBlur",?typeof(WindowAcrylicBlur),
????????????????typeof(WindowAcrylicBlur),
????????????????new?PropertyMetadata(default(WindowAcrylicBlur),?OnWindowAcryBlurPropertyChangedCallBack));

????????private?static?void?OnWindowAcryBlurPropertyChangedCallBack(DependencyObject?d,
????????????DependencyPropertyChangedEventArgs?e)
????????{
????????????if?(!(d?is?Window?window))
????????????????return;

????????????if?(e.OldValue?==?null?&&?e.NewValue?==?null)
????????????????return;

????????????if?(e.OldValue?==?null?&&?e.NewValue?!=?null)
????????????{
????????????????window.Initialized?+=?Window_Initialized;
????????????????window.Loaded?+=?Window_Loaded;
????????????}

????????????if?(e.OldValue?!=?null?&&?e.NewValue?==?null)
????????????{
????????????????var?vConfig?=?GetWindowOldConfig(d);
????????????????if?(vConfig?!=?null)
????????????????{
????????????????????window.WindowStyle?=?vConfig.WindowStyle;
????????????????????window.AllowsTransparency?=?vConfig.AllowsTransparency;
????????????????????window.Background?=?vConfig.Background;

????????????????????if?(vConfig.WindowChrome?!=?null)
????????????????????{
????????????????????????var?vWindowChrome?=?WindowChrome.GetWindowChrome(window);
????????????????????????if?(vWindowChrome?!=?null)
????????????????????????????vWindowChrome.GlassFrameThickness?=?vConfig.WindowChrome.GlassFrameThickness;
????????????????????}
????????????????}
????????????}

????????????if?(e.OldValue?==?e.NewValue)
????????????{
????????????????if?(!window.IsLoaded)
????????????????????return;

????????????????var?vBlur?=?e.NewValue?as?WindowAcrylicBlur;
????????????????if?(vBlur?==?null)
????????????????????return;

????????????????EnableAcrylicBlur(window,?vBlur.BlurColor,?vBlur.Opacity,?true);
????????????}
????????}

????????#endregion


????????#region?内部设置

????????private?static?WindowOldConfig?GetWindowOldConfig(DependencyObject?obj)
????????{
????????????return?(WindowOldConfig)?obj.GetValue(WindowOldConfigProperty);
????????}

????????private?static?void?SetWindowOldConfig(DependencyObject?obj,?WindowOldConfig?value)
????????{
????????????obj.SetValue(WindowOldConfigProperty,?value);
????????}

????????//?Using?a?DependencyProperty?as?the?backing?store?for?WindowOldConfig.??This?enables?animation,?styling,?binding,?etc...
????????private?static?readonly?DependencyProperty?WindowOldConfigProperty?=
????????????DependencyProperty.RegisterAttached("WindowOldConfig",?typeof(WindowOldConfig),?typeof(WindowAcrylicBlur),
????????????????new?PropertyMetadata(default(WindowOldConfig)));

????????#endregion

????????#region

????????public?Color?BlurColor
????????{
????????????get?=>?(Color)?GetValue(BlurColorProperty);
????????????set?=>?SetValue(BlurColorProperty,?value);
????????}

????????//?Using?a?DependencyProperty?as?the?backing?store?for?BlurColor.??This?enables?animation,?styling,?binding,?etc...
????????public?static?readonly?DependencyProperty?BlurColorProperty?=
????????????DependencyProperty.Register("BlurColor",?typeof(Color),?typeof(WindowAcrylicBlur),
????????????????new?PropertyMetadata(default(Color)));

????????public?double?Opacity
????????{
????????????get?=>?(double)?GetValue(OpacityProperty);
????????????set?=>?SetValue(OpacityProperty,?value);
????????}

????????//?Using?a?DependencyProperty?as?the?backing?store?for?Opacity.??This?enables?animation,?styling,?binding,?etc...
????????public?static?readonly?DependencyProperty?OpacityProperty?=
????????????DependencyProperty.Register("Opacity",?typeof(double),?typeof(WindowAcrylicBlur),
????????????????new?PropertyMetadata(default(double)));

????????#endregion
????}
}

2) 使用AcrylicBlurWindowExample.xaml如下:

<Window?x:Class="WPFDevelopers.Samples.ExampleViews.AcrylicBlurWindowExample"
????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
????????xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
????????xmlns:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"
????????mc:Ignorable="d"?WindowStartupLocation="CenterScreen"
????????ResizeMode="CanMinimize"
????????Title="Login"?Height="350"?Width="400">
????<wpfdev:WindowChrome.WindowChrome>
????????<wpfdev:WindowChrome??GlassFrameThickness="0?1?0?0"/>
????</wpfdev:WindowChrome.WindowChrome>
????<wpfdev:WindowAcrylicBlur.WindowAcrylicBlur>
????????<wpfdev:WindowAcrylicBlur?BlurColor="AliceBlue"?Opacity="0.2"/>
????</wpfdev:WindowAcrylicBlur.WindowAcrylicBlur>
????<Grid>
????????<Grid.RowDefinitions>
????????????<RowDefinition?Height="40"/>
????????????<RowDefinition/>
????????</Grid.RowDefinitions>
????????<StackPanel?HorizontalAlignment="Right"?
????????????????????????Orientation="Horizontal"
????????????????????????Grid.Column="1"
????????????????????????wpfdev:WindowChrome.IsHitTestVisibleInChrome="True">
????????????<Button?Style="{DynamicResource?WindowButtonStyle}"
????????????????????Command="{Binding?CloseCommand,RelativeSource={RelativeSource?AncestorType=local:AcrylicBlurWindowExample}}"?Cursor="Hand">
????????????????<Path?Width="10"?Height="10"
??????????????????????HorizontalAlignment="Center"
??????????????????????VerticalAlignment="Center"
??????????????????????Data="{DynamicResource?PathMetroWindowClose}"
??????????????????????Fill="Red"
??????????????????????Stretch="Fill"?/>
????????????</Button>
????????</StackPanel>
????????<StackPanel?Grid.Row="1"?Margin="40,0,40,0"
????????????????????wpfdev:WindowChrome.IsHitTestVisibleInChrome="True">
????????????<Image?Source="/WPFDevelopers.ico"?Width="80"?Height="80"/>
????????????<TextBox?wpfdev:ElementHelper.IsWatermark="True"?wpfdev:ElementHelper.Watermark="账户"?Margin="0,20,0,0"?Cursor="Hand"/>
????????????<PasswordBox?wpfdev:ElementHelper.IsWatermark="True"?wpfdev:ElementHelper.Watermark="密码"??Margin="0,20,0,0"?Cursor="Hand"/>
????????????<Button?x:Name="LoginButton"?
????????????????????Content="登?录"?
????????????????????Margin="0,20,0,0"
????????????????????Style="{StaticResource?PrimaryButton}"/>
????????????<Grid?Margin="0?20?0?0">
????????????????<TextBlock?FontSize="12">
????????????????????<Hyperlink?Foreground="Black"?TextDecorations="None">忘记密码</Hyperlink>
????????????????</TextBlock>
????????????????<TextBlock?FontSize="12"?HorizontalAlignment="Right"?Margin="0?0?-1?0">
????????????????????<Hyperlink?Foreground="#4370F5"?TextDecorations="None">注册账号</Hyperlink>
????????????????</TextBlock>
????????????</Grid>
????????</StackPanel>

????</Grid>
</Window>

3) 使用AcrylicBlurWindowExample.xaml.cs如下:

using?System.Windows;
using?System.Windows.Input;
using?WPFDevelopers.Samples.Helpers;

namespace?WPFDevelopers.Samples.ExampleViews
{
????///?<summary>
????///?AcrylicBlurWindowExample.xaml?的交互逻辑
????///?</summary>
????public?partial?class?AcrylicBlurWindowExample?:?Window
????{
????????public?AcrylicBlurWindowExample()
????????{
????????????InitializeComponent();
????????}
????????public?ICommand?CloseCommand?=>?new?RelayCommand(obj?=>
????????{
???????????Close();
????????});
????}
}

实现效果

到此这篇关于WPF实现窗体亚克力效果的示例代码的文章就介绍到这了,更多相关WPF窗体亚克力内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • C#实现鼠标消息捕获

    C#实现鼠标消息捕获

    这篇文章介绍了C#实现鼠标消息捕获的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C# 解析 Excel 并且生成 Csv 文件代码分析

    C# 解析 Excel 并且生成 Csv 文件代码分析

    这篇文章主要介绍了C# 解析 Excel 并且生成 Csv 文件的方法和代码分享,有需要的朋友可以参考下
    2014-10-10
  • c# 垃圾回收(GC)优化

    c# 垃圾回收(GC)优化

    这篇文章主要介绍了c# 垃圾回收(GC)优化的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2021-02-02
  • C# 大数据导出word的假死报错的处理方法

    C# 大数据导出word的假死报错的处理方法

    C# 大数据导出word的假死报错的处理方法,需要的朋友可以参考一下
    2013-03-03
  • C#异步原理详情

    C#异步原理详情

    这篇文章主要介绍了C#异步原理,C#异步在C#5便发布了,是利用async关键字和await表达式表达的异步操作,下面文章下边将详细向大家介绍C#异步原理,感兴趣得小伙伴可以参考一下
    2021-10-10
  • C#基于Sockets类实现TCP通讯

    C#基于Sockets类实现TCP通讯

    这篇文章主要为大家详细介绍了C#基于Sockets类实现TCP通讯,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#中Action和Func的区别

    C#中Action和Func的区别

    这篇文章主要介绍了C#中Action和Func的区别,是进行C#程序设计时需要加以注意的知识点,需要的朋友可以参考下
    2014-09-09
  • C#条码生成类分享

    C#条码生成类分享

    这篇文章主要分享了C#条码生成类的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C# XML序列化方法及常用特性总结分析

    C# XML序列化方法及常用特性总结分析

    这篇文章主要介绍了C# XML序列化方法及常用特性,总结分析了C# xml序列化的实现方法及序列化常用Attribute含义与功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C# WebApi+Webrtc局域网音视频通话实例

    C# WebApi+Webrtc局域网音视频通话实例

    这篇文章主要为大家详细介绍了C# WebApi+Webrtc局域网音视频通话实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论

?


http://www.vxiaotou.com