Bootstrap

关于WPF下拉式菜单默认右对齐问题的原因与解决方案

一、问题描述

当你搜到这个帖子的时候,相信你和我一样也遇到了如下图所示的问题吧!在WinForm中从来没有存在过的问题,为什么到了WPF这儿会产生这种诡异的现象?如果你有同样的问题,那么恭喜你!你成功找到解决方案啦!

二、问题原因

问题产生的原因是你和我的电脑一样支持手写,或者是你曾经使用过手写板,那么想必此时你电脑的状态栏中一定有这样的一个图标。

没错!导致菜单栏向右弹出的罪魁祸首就是这个东西,因为系统默认你是惯用右手者,在你触屏的时候WPF为了防止你的手挡住菜单栏,所以才导致的右对齐弹出。

PS:虽然这个本应该是WPF比WinForm高级的地方,但是对于用过手写板的开发者和用户反而成了累赘。

三、解决方案

为了恢复传统的下拉菜单左对齐,在你的MainWindow(就是你程序第一个启动的窗口)的InitializeComponent()后面加上下面这段代码,你的问题就彻底解决啦!

//获取系统是以Left-handed(true)还是Right-handed(false)
var ifLeft = SystemParameters.MenuDropAlignment;
if (ifLeft)
{
    // change to false
    var t = typeof(SystemParameters);
    var field = t.GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static);
    field.SetValue(null, false);
    ifLeft = SystemParameters.MenuDropAlignment;
}

;