在Win11电脑使用Win10的效果展现WPF

在Win11更新后,开发WPF的界面一直是圆弧的四角,需要同学可能不喜欢,就是喜欢Win10版本以前的四四方方的规范,怎么办呢
我们可以自定义一个附加属性

 // 定义一个静态类,用于控制窗口圆角样式
 public static class WindowCornerPreference
 {
     // 定义附加属性CornerPreferenceProperty
     // DependencyProperty.RegisterAttached用于注册一个可以在任何DependencyObject上附加的属性
     public static readonly DependencyProperty CornerPreferenceProperty =
         DependencyProperty.RegisterAttached(
             "CornerPreference",  // 属性名称
             typeof(DWM_WINDOW_CORNER_PREFERENCE),  // 属性类型(使用自定义枚举)
             typeof(WindowCornerPreference),  // 属性所有者类型(当前类)
             new PropertyMetadata(  // 属性元数据
                 DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_DEFAULT,  // 默认值(系统默认)
                 OnCornerPreferenceChanged));  // 属性值变更时的回调方法

     // GetCornerPreference - 附加属性的get访问器
     // 从指定window获取CornerPreference属性的值
     public static DWM_WINDOW_CORNER_PREFERENCE GetCornerPreference(Window window)
     {
         // 从window对象获取附加属性的值,并转换为枚举类型
         return (DWM_WINDOW_CORNER_PREFERENCE)window.GetValue(CornerPreferenceProperty);
     }

     // SetCornerPreference - 附加属性的set访问器
     // 为指定window设置CornerPreference属性的值
     public static void SetCornerPreference(Window window, DWM_WINDOW_CORNER_PREFERENCE value)
     {
         // 设置window对象的附加属性值
         window.SetValue(CornerPreferenceProperty, value);
     }

     // 属性值变更时的回调方法
     private static void OnCornerPreferenceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         // 检查依赖对象是否是Window类型
         if (d is Window window)
         {
             // 如果窗口已加载,立即应用圆角设置
             if (window.IsLoaded)
             {
                 ApplyCornerPreference(window);
             }
             else
             {
                 // 如果窗口未加载,订阅Loaded事件,在窗口加载后应用设置
                 window.Loaded += (sender, args) => ApplyCornerPreference(window);
             }
         }
     }

     // 实际应用圆角设置的方法
     private static void ApplyCornerPreference(Window window)
     {
         // 获取窗口的句柄(Handle)
         var hWnd = new WindowInteropHelper(window).EnsureHandle();

         // 指定要设置的窗口属性 - 圆角偏好
         var attribute = DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE;

         // 获取要设置的圆角偏好值
         var preference = GetCornerPreference(window);

         // 调用Windows API设置窗口属性
         DwmSetWindowAttribute(hWnd, attribute, ref preference, sizeof(uint));
     }

     // 定义DWM窗口属性枚举
     private enum DWMWINDOWATTRIBUTE
     {
         // 控制窗口圆角效果的属性,值为33
         DWMWA_WINDOW_CORNER_PREFERENCE = 33
     }

     // 定义窗口圆角偏好枚举
     public enum DWM_WINDOW_CORNER_PREFERENCE
     {
         DWMWCP_DEFAULT = 0,    // 系统默认决定是否使用圆角
         DWMWCP_DONOTROUND = 1, // 强制不使用圆角
         DWMWCP_ROUND = 2,      // 使用圆角
         DWMWCP_ROUNDSMALL = 3  // 使用较小的圆角
     }

     // 导入DWM API函数
     // PreserveSig=false表示将HRESULT返回值转换为.NET异常(失败时抛出异常)
     [DllImport("dwmapi.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
     private static extern void DwmSetWindowAttribute(
         IntPtr hwnd,                     // 窗口句柄
         DWMWINDOWATTRIBUTE attribute,    // 要设置的属性
         ref DWM_WINDOW_CORNER_PREFERENCE pvAttribute,  // 属性值(引用传递)
         uint cbAttribute);               // 属性值的大小
 }

使用的时候在Window界面xaml加上

local:WindowCornerPreference.CornerPreference="DWMWCP_DONOTROUND"
posted @ 2025-08-17 22:52  孤沉  阅读(18)  评论(0)    收藏  举报