zoukankan      html  css  js  c++  java
  • 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

           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;
           }
    

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

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

      

            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的构造函数里调用一下。

  • 相关阅读:
    布局
    面向对象....(概况)
    下拉城市列表
    下拉列表
    内容窗体
    《面向对象》-继承
    《面向对象》--类
    《面向对象》第一讲
    常用的正则表达式
    正则表达式
  • 原文地址:https://www.cnblogs.com/m7777/p/4487079.html
Copyright © 2011-2022 走看看