You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF设置ResizeMode=NoResize和WindowStyle=None后窗口无阴影及圆角问题

解决WPF无框窗口的圆角与阴影问题(无需DropShadow Border)

方案:调用系统DWM API实现原生阴影与圆角

当WPF窗口设置WindowStyle="None"和ResizeMode="NoResize"后,会丢失系统默认的窗口装饰(包括阴影、圆角)。通过调用Windows原生的DWM(Desktop Window Manager)API,可以让系统为窗口添加原生的阴影和圆角效果,这种方式不会干扰窗口内容渲染,也不需要额外的Border控件。

实现步骤:

  1. 导入DWM相关API声明:
using System.Runtime.InteropServices;

public static class DwmApi
{
    [DllImport("dwmapi.dll")]
    public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);

    [DllImport("dwmapi.dll")]
    public static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);

    public struct MARGINS
    {
        public int cxLeftWidth;
        public int cxRightWidth;
        public int cyTopHeight;
        public int cyBottomHeight;
    }

    // DWM窗口属性常量
    public const int DWMWA_WINDOW_CORNER_PREFERENCE = 33;
    public const int DWMWCP_ROUND = 2; // 圆角样式
}
  1. 在窗口Loaded事件中配置DWM属性:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;

    // 启用窗口圆角
    int cornerPreference = DwmApi.DWMWCP_ROUND;
    DwmApi.DwmSetWindowAttribute(hwnd, DwmApi.DWMWA_WINDOW_CORNER_PREFERENCE, ref cornerPreference, sizeof(int));

    // 扩展窗口框架到客户端区域,确保系统阴影正常显示
    DwmApi.MARGINS margins = new DwmApi.MARGINS { cxLeftWidth = 1, cxRightWidth = 1, cyTopHeight = 1, cyBottomHeight = 1 };
    DwmApi.DwmExtendFrameIntoClientArea(hwnd, ref margins);

    // 窗口背景设为透明,避免遮挡阴影
    this.Background = Brushes.Transparent;
}
  1. 窗口XAML基础配置:
<Window x:Class="YourNamespace.YourWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Borderless Window"
        WindowStyle="None"
        ResizeMode="NoResize"
        Width="400" Height="300"
        Loaded="Window_Loaded"
        AllowsTransparency="True"> <!-- 必须开启透明才能让阴影、圆角正常显示 -->
    <!-- 内容容器设置Margin,避免边缘内容被圆角裁剪 -->
    <Grid Background="White" Margin="8">
        <!-- 这里放置你的窗口内容 -->
        <TextBlock Text="窗口内容正常渲染" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

关键注意点:

  • AllowsTransparency="True"和Background="Transparent"是必须项,否则系统阴影和圆角无法正常显示。
  • 内容容器的Margin用于避免边缘内容被圆角裁剪,数值可根据实际需求调整。
  • 圆角功能支持Windows 10 1809及以上版本,更低版本可移除圆角相关代码,仅保留阴影效果。

关于你之前方案失败的原因

你提到的方案仅显示白色矩形,大概率是因为未正确开启窗口透明属性,或内容容器的层级嵌套错误,导致内容被遮挡。而DWM API的实现方式是系统级渲染,不会出现这类问题。

内容的提问来源于stack exchange,提问作者IL Bianco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:27:35