Windows 11上下文菜单样式

7

Windows Forms上下文菜单控件(使用ContextMenuStrip)提供的默认样式看起来像是为Office XP创建的 - 其样式与Windows 11并不完全匹配。

Example of an old context menu in Windows 11

相比之下,现代的 Windows 11 上下文菜单具有圆角并且支持主题:

Theme-aware Windows 11 context menu

即使对于一些遗留应用程序,它没有主题感知能力,但仍然使用圆角。

Example of modern Windows 11 context menu

我该如何从Windows Forms(或控制台)应用程序复制Windows 11托盘图标的主题感知样式和现代(圆角)上下文菜单?
理想情况下,我希望不必从头编写整个托盘菜单渲染器,而是重复使用内置的操作系统组件,但目前为止,我在确定需要使用什么工具来获取菜单方面遇到了困难。

根据雷蒙德·陈(Raymond Chen)的说法,Windows 11风格的菜单是由XAML CommandBars构建的。 - Jonathan Potter
本地的win32应用程序可以选择是否启用四舍五入,如果Windows没有检测到所有者绘制、窗口区域等,则默认进行四舍五入。 - Anders
1
ContextMenu类使用操作系统提供的上下文菜单服务,而ContextMenuStrip具有自己的渲染器。但它没有更新为Win11兼容。对于ContextMenu而言,.NETCore项目中没有设计时支持。 - Hans Passant
1个回答

2

使用这个类

class CustomContextMenu : ContextMenuStrip
{
    [DllImport("dwmapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern long DwmSetWindowAttribute(IntPtr hwnd,
                                                        DWMWINDOWATTRIBUTE attribute,
                                                        ref DWM_WINDOW_CORNER_PREFERENCE pvAttribute,
                                                        uint cbAttribute);
    
    public CustomContextMenu()
    {
        var preference = DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUND;     //change as you want
        DwmSetWindowAttribute(Handle,
                              DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE,
                              ref preference,
                              sizeof(uint));
    }

    public enum DWMWINDOWATTRIBUTE
    {
        DWMWA_WINDOW_CORNER_PREFERENCE = 33
    }
    public enum DWM_WINDOW_CORNER_PREFERENCE
    {
        DWMWA_DEFAULT = 0,
        DWMWCP_DONOTROUND = 1,
        DWMWCP_ROUND = 2,
        DWMWCP_ROUNDSMALL = 3,
    }
}

很抱歉,那看起来完全不一样。 - Edwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接