在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"

浙公网安备 33010602011771号