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

問題描述參考 html

wpf 客戶端【JDAgent桌面助手】開發詳解(四) popup控件的win8.0的bug

當開發完程序後,咱們在多操做系統測試時候發現:win8.0  系統中 popup 彈出的位置總是不對。windows

以下圖:函數

WinXp /Vista/Win7/Win8.1 下面windows 右鍵菜單彈出的位置(紅色圈爲 鼠標指針位置)post

Win8.0 下面windows 右鍵菜單彈出的位置(紅色圈爲 鼠標指針位置)測試

 

 

Popup 控件也是這個狀況。須要在代碼裏面判斷windows的版本。若是是win8.0 popup 的HorizontalOffset、VerticalOffset值須要調整。url

 

 

解決方案一。。經過註冊表來獲取當前系統版本操作系統

    由於  Environment.OSVersion.Version 獲取到的win8.0跟win8.1信息是同樣的。3d

    經過註冊表獲取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;
       }

    注意,,這種方法須要添加管理員權限。。htm

 

解決方案二。修改彈出菜單相對於相應菜單項是左對齊仍是右對齊。(組長調出的)

  

        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的構造函數裏調用一下。

相關文章
相關標籤/搜索