wpf Popup Win8.0 bug HorizontalOffset 弹出位置偏移

问题描述参考 

wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

当开发完程序后,我们在多操作系统测试时候发现:win8.0  系统中 popup 弹出的位置老是不对。

如下图:

WinXp /Vista/Win7/Win8.1 下面windows 右键菜单弹出的位置(红色圈为 鼠标指针位置)

Win8.0 下面windows 右键菜单弹出的位置(红色圈为 鼠标指针位置)

 

 

Popup 控件也是这个情况。需要在代码里面判断windows的版本。如果是win8.0 popup 的HorizontalOffset、VerticalOffset值需要调整。

 

 

解决方案一。。通过注册表来获取当前系统版本

    因为  Environment.OSVersion.Version 获取到的win8.0跟win8.1信息是一样的。

    通过注册表获取win8.0代码为6.2 ,win8.1代码为6.3

1
2
3
4
5
6
7
8
9
10
11
12
public static string SetRegister()
{
    string regpath = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
    RegistryKey uaes = Registry.LocalMachine.OpenSubKey(regpath,
        RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
    if (uaes == null)
        uaes = Registry.LocalMachine.CreateSubKey(regpath, RegistryKeyPermissionCheck.ReadWriteSubTree);
 
    var registData = uaes.GetValue("CurrentVersion").ToString();
 
    return registData;
}

    注意,,这种方法需要添加管理员权限。。

 

解决方案二。修改弹出菜单相对于相应菜单项是左对齐还是右对齐。(组长调出的)

  

1
2
3
4
5
6
7
8
9
10
11
public static void FixPopupBug()
{
    var ifLeft = SystemParameters.MenuDropAlignment;
    if (ifLeft)
    {
        var t = typeof(SystemParameters);
        var field = t.GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
        field.SetValue(null, false);
    }
    
}

  将win8.0下弹出菜单默认弹出到左边改为右边。  在App.xaml.cs的构造函数里调用一下。

 

posted @   莫欺  阅读(1937)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示