<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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(@"SoftwareMicrosoftWindows NTCurrentVersion"); 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表單亞克力內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45